tri*_*eta 47 python django dictionary unit-testing
老实说,我一直都在使用assertDictEqual,因为有时当我没有使用它时,我得到的信息是,相同的dicts不一样.
但是......我知道==操作员可以比较dicts :
>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]}
True
Run Code Online (Sandbox Code Playgroud)
我可能需要的地方assertDictEqual?
jon*_*rpe 77
基本上,它允许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):
assert self.D1 == self.D2
def test_useful(self):
self.assertDictEqual(self.D1, self.D2)
Run Code Online (Sandbox Code Playgroud)
他们的产出:
Failure
Traceback (most recent call last):
File "...x.py", line 86, in test_not_so_useful
assert self.D1 == self.D2
AssertionError
Run Code Online (Sandbox Code Playgroud)
与
Failure
Traceback (most recent call last):
File "...x.py", line 80, in test_useful
self.assertDictEqual(self.D1, self.D2)
AssertionError: {'a': 1, 'c': [1, 2], 'b': 2} != {'a': 1, 'c': [1], 'b': 2}
- {'a': 1, 'b': 2, 'c': [1, 2]}
? ---
+ {'a': 1, 'b': 2, 'c': [1]}
Run Code Online (Sandbox Code Playgroud)
在后者中,您可以确切地看到差异是什么,您不必自己解决.请注意,您可以使用标准assertEqual而不是assertDictEqual,使用相同的结果; 根据文档
...通常没有必要直接调用这些方法.
小智 7
这是一个更广泛的问题的一部分:
为什么unittest有所有的特殊断言呢?
答案是这些方法的主要工作是在UnitTest assert*测试失败时为您提供有意义的输出。看看unittest模块代码——这真的是他们所做的主要事情(只是他们所做的?)
鉴于 Python 是一种易于内省的动态语言,为什么还要麻烦呢?答案是“因为unittest是从 Javajunit包中移植过来的,这就是他们在 Java 中的做法”(并且可能不得不这样做,因为在运行时内省是多么困难或不可能)。
所以我的建议是:除非您正在为标准库编写测试,否则根本不要使用 unittest —— 它所做的只是妨碍。我用pytest. nose也可能是一个不错的选择。它使编写测试变得更快、更容易,并且在出现错误时可以获得出色的报告。
它还包括许多用于参数化测试、夹具、测试配置、模拟等的漂亮功能......
如果您在一个已经使用的项目中unittest——您仍然可以使用 运行您的测试pytest,并获得它的许多优点。
| 归档时间: |
|
| 查看次数: |
41946 次 |
| 最近记录: |