如果字典可以通过`==`进行比较,为啥需要assertDictEqual?
Posted
技术标签:
【中文标题】如果字典可以通过`==`进行比较,为啥需要assertDictEqual?【英文标题】:Why is assertDictEqual needed if dicts can be compared by `==`?如果字典可以通过`==`进行比较,为什么需要assertDictEqual? 【发布时间】:2016-03-28 15:04:30 【问题描述】:老实说,我一直用assertDictEqual
,因为有时我不使用它时,我得到了信息,即相等的dicts是不一样的。
但是...我知道字典可以通过==
运算符进行比较:
>>> 'a':1, 'b':2, 'c': [1,2] == 'b':2, 'a':1, 'c': [1,2]
True
我实际上可能需要assertDictEqual
?
【问题讨论】:
因为unittest
可以为您提供更多关于它们究竟如何不同的信息,并为您提供有用的反馈,而不是简单的AssertionError
。如果你使用例如py.test
,您可以只使用常规的assert
,它会通过自省得出相应的错误报告。
【参考方案1】:
基本上,它允许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)
以及他们的输出:
Failure
Traceback (most recent call last):
File "...x.py", line 86, in test_not_so_useful
assert self.D1 == self.D2
AssertionError
对比
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]
在后者中,您可以确切地看到不同之处,您不必自己解决。请注意,您可以只使用标准的assertEqual
而不是assertDictEqual
,结果相同;每the docs
...通常不需要直接调用这些方法。
【讨论】:
我在进行代码审查时遇到了这个问题,我注意到接受的答案不再正确。从python 2.7.15
开始,当输入是字典时,assertEqual
的行为与assertDictEqual
相同。无论我使用哪种方法,我都得到了相同的详细输出。
@ivange94 我确实在答案中明确说过。这里比较的是assert a == b
。
哦,我的错。 @johrsharpe。我没有正确阅读问题。在我看来,问题是why use assertDictEqual when assertEqual can compare dictionaries
assert dict equal 是否考虑键的顺序?
@variable 它只是一个简单的相等比较的包装器:github.com/python/cpython/blob/3.8/Lib/unittest/case.py#L1205【参考方案2】:
我假设这是在单元测试的背景下。 assertDictEqual
方法不仅会比较 dict
s 并评估为 True
或 False
,还可以为您提供其他信息,例如两个 dict
s 之间的确切差异。
此外,在一个好的 IDE 中,单元测试可以很好地集成。您只需添加TestCase
,使用assertDictEqual
,IDE 就会为您找到并运行测试。然后以易于阅读的格式显示输出。这可以为您节省大量样板代码。
我会对两个相等的dict
s 与==
不相等的情况非常感兴趣。
【讨论】:
由于 dict 是无序结构,assertDictEqual 不考虑项目的顺序。你知道这个概念是否已经改变,因为 python 3.7 以后的 dict 是有序的(保持插入顺序)? @variable 还是 ***.com/questions/34414326/…【参考方案3】:这是一个更广泛的问题的一部分:
为什么unittest
有所有的特殊断言?
答案是UnitTest
assert*
方法的主要工作是在测试失败时为您提供有意义的输出。看看unittest
模块代码——这实际上是他们所做的大部分事情(只是他们所做的事情?)
鉴于 Python 是一种易于自省的动态语言,为什么还要麻烦这些呢?答案是“因为 unittest
是从 Java junit
包中移植的,这就是他们在 Java 中的做法”(可能不得不这样做,因为在运行时自省是多么困难或不可能)。
所以我的建议是:除非您正在为标准库编写测试,否则根本不要使用 unittest —— 它所做的只是妨碍您。我使用pytest
。 nose
也可能是一个不错的选择。它使编写测试变得更快、更容易,并且在出现错误时获得出色的报告。
它还包括许多用于参数化测试、夹具、测试配置、模拟等的漂亮功能......
如果您的项目已经使用unittest
-- 您仍然可以使用pytest
运行测试,并获得它的许多优势。
【讨论】:
以上是关于如果字典可以通过`==`进行比较,为啥需要assertDictEqual?的主要内容,如果未能解决你的问题,请参考以下文章