如何在Django单元测试中输出完整的差异?

时间:2016-05-12 08:43:32

标签: python django unit-testing python-unittest

当我在REPL中使用assertEqual()和两个字典时,它会向我显示差异,例如:

>>> import unittest
>>> class A(unittest.TestCase):
...   pass
... 
>>> a = A()
>>> d1 = dict(zip(range(10), range(1000000, 1000010)))
>>> d2 = dict(zip(range(3, 13), range(1000003, 1000013)))
>>> a.assertEqual(d1, d2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/unittest/case.py", line 820, in assertEqual
    assertion_func(first, second, msg=msg)
  File "/usr/lib/python3.5/unittest/case.py", line 1111, in assertDictEqual
    self.fail(self._formatMessage(msg, standardMsg))
  File "/usr/lib/python3.5/unittest/case.py", line 665, in fail
    raise self.failureException(msg)
AssertionError: {0: 1000000, 1: 1000001, 2: 1000002, 3: 10[73 chars]0009} != {3: 1000003, 4: 1000004, 5: 1000005, 6: 10[76 chars]0012}
- {0: 1000000,
-  1: 1000001,
-  2: 1000002,
-  3: 1000003,
? ^

+ {3: 1000003,
? ^

   4: 1000004,
   5: 1000005,
   6: 1000006,
   7: 1000007,
   8: 1000008,
-  9: 1000009}
?            ^

+  9: 1000009,
?            ^

+  10: 1000010,
+  11: 1000011,
+  12: 1000012}

当我在Django单元测试中执行相同操作时,有时会打印差异,有时只打印第一条缩短的行。我想知道,我怎么能让它始终打印差异。
我使用./manage.py test -v 3运行Django测试。

2 个答案:

答案 0 :(得分:4)

如果您将anchor设置为None,则会显示完整差异。

class A(unittest.TestCase):
    maxDiff = None
    ...

答案 1 :(得分:0)

一个古老的问题,但对像我一样阅读此书的其他人来说,都是值得回答的!​​

您应该设置maxDiff = None,但也要使用assertDictEqual()而不是assertEqual()

设置maxDiff = None对OP不起作用的原因是他们正在使用assertEqual()maxDiff = None仅影响assertSequenceEqual()中的assertDictEqual()assertMultiLineEqual()unittest,请参阅the docs