如果字典可以通过`==`进行比较,为什么还需要assertDictEqual?

问题描述 投票:0回答:3

我一直使用

assertDictEqual
,因为有时当我不使用它时,我得到的信息是相等的字典不一样。

但我知道字典可以通过

==
运算符进行比较:

>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]}
True

我在哪里可能真正需要

assertDictEqual

python unit-testing
3个回答
153
投票

基本上,它允许

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
,获得相同的结果;根据 文档

...通常不需要直接调用这些方法。


8
投票

这是更广泛问题的一部分:

为什么

unittest
有所有特殊断言?

答案是

UnitTest
assert*
方法的主要工作是在测试失败时为您提供有意义的输出。看一下
unittest
模块代码——这实际上就是他们所做的(只是他们所做的?)

鉴于 Python 是一种易于自省的动态语言,为什么还要这么麻烦呢?答案是“因为

unittest
是从 Java
junit
包移植的,这就是他们在 Java 中的做法”(考虑到在运行时进行内省是多么困难或不可能,可能不得不这么做)。

所以我的建议:除非您正在为标准库编写测试,否则根本不要使用单元测试 - 它所做的只是妨碍。我用

pytest
nose
可能也是一个不错的选择。它使编写测试变得更快、更容易,并且当出现错误时您可以获得出色的报告。

它还包括许多用于参数化测试、夹具、测试配置、模拟等的漂亮功能...

如果您所在的项目已经使用

unittest
- 您仍然可以使用
pytest
运行测试,并获得它的许多优点。


1
投票

我认为这是在单元测试的背景下。

assertDictEqual
方法不仅会比较
dict
并评估为
True
False
,而且还可以为您提供更多信息,例如两个
dict
之间的确切差异。

此外,在一个好的 IDE 中,单元测试可以很好地集成。您只需添加

TestCase
,然后使用
assertDictEqual
,IDE 就会为您找到并运行测试。然后输出以易于阅读的格式显示。这可以为您节省大量样板代码。

我对两个相等的

dict
==
相比不相等的情况非常感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.