我一直使用
assertDictEqual
,因为有时当我不使用它时,我得到的信息是相等的字典不一样。
但我知道字典可以通过
==
运算符进行比较:
>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]}
True
我在哪里可能真正需要
assertDictEqual
?
基本上,它允许
unittest
为您提供有关测试失败的原因的更多信息(“诊断”,使用 Steve Freeman 和 Nat Pryce 的“Growing Object-Oriented Software Guided by Tests”中的语言) )。比较这两个测试:
import unittest
class DemoTest(unittest.TestCase):
D1 = {'a': 1, 'b': 2, 'c': [1, 2]}
D2 = {'a': 1, 'b': 2, 'c': [1]}
def test_not_so_useful(self):
self.assertTrue(self.D1 == self.D2)
def test_useful(self):
self.assertDictEqual(self.D1, self.D2)
if __name__ == "__main__":
unittest.main()
他们的输出:
======================================================================
FAIL: test_not_so_useful (__main__.DemoTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "path/to/file.py", line 10, in test_not_so_useful
self.assertTrue(self.D1 == self.D2)
AssertionError: False is not true
与
======================================================================
FAIL: test_useful (__main__.DemoTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "path/to/file.py", line 13, in test_useful
self.assertDictEqual(self.D1, self.D2)
AssertionError: {'a': 1, 'b': 2, 'c': [1, 2]} != {'a': 1, 'b': 2, 'c': [1]}
- {'a': 1, 'b': 2, 'c': [1, 2]}
? ---
+ {'a': 1, 'b': 2, 'c': [1]}
在后者中,您可以准确地看到差异是什么,而不必自己解决。请注意,您可以仅使用标准
assertEqual
代替 assertDictEqual
,获得相同的结果;根据 文档
...通常不需要直接调用这些方法。
这是更广泛问题的一部分:
为什么
unittest
有所有特殊断言?
答案是
UnitTest
assert*
方法的主要工作是在测试失败时为您提供有意义的输出。看一下 unittest
模块代码——这实际上就是他们所做的(只是他们所做的?)
鉴于 Python 是一种易于自省的动态语言,为什么还要这么麻烦呢?答案是“因为
unittest
是从 Java junit
包移植的,这就是他们在 Java 中的做法”(考虑到在运行时进行内省是多么困难或不可能,可能不得不这么做)。
所以我的建议:除非您正在为标准库编写测试,否则根本不要使用单元测试 - 它所做的只是妨碍。我用
pytest
。 nose
可能也是一个不错的选择。它使编写测试变得更快、更容易,并且当出现错误时您可以获得出色的报告。
它还包括许多用于参数化测试、夹具、测试配置、模拟等的漂亮功能...
如果您所在的项目已经使用
unittest
- 您仍然可以使用 pytest
运行测试,并获得它的许多优点。
我认为这是在单元测试的背景下。
assertDictEqual
方法不仅会比较 dict
并评估为 True
或 False
,而且还可以为您提供更多信息,例如两个 dict
之间的确切差异。
此外,在一个好的 IDE 中,单元测试可以很好地集成。您只需添加
TestCase
,然后使用 assertDictEqual
,IDE 就会为您找到并运行测试。然后输出以易于阅读的格式显示。这可以为您节省大量样板代码。
我对两个相等的
dict
与 ==
相比不相等的情况非常感兴趣。