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

时间:2015-12-22 11:00:49

标签: python django unit-testing dictionary

老实说,我一直使用 myUrl = new TextField<String>("url"); myUrl.add(new UrlValidator(new String[]{"http", "https"})); myUrl.setLabel(new StringResourceModel("lbl.myLink", this, null)); myUrl .setOutputMarkupId(true) .add(new AjaxFormComponentUpdatingBehavior("oninput") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { target.add(myLinkFeedback); formGroup.setFeedbackStatus(BootstrapFormGroup.VALIDATION_SUCCESS); target.add(formGroup); } @Override protected void onError(AjaxRequestTarget target, RuntimeException e) { target.add(myLinkFeedback); formGroup.setFeedbackStatus(BootstrapFormGroup.VALIDATION_ERROR); target.add(formGroup); } }); formGroup = new BootstrapFormGroup("formGroup", new StringResourceModel("lbl.myLink", this, null)); formGroup.setOutputMarkupId(true); formGroup.setShowFeedbackStatusIcon(true); formGroup.add(myUrl); myLinkFeedback = new BootstrapFieldFeedbackPanel("myLinkFeedbackField", myUrl); formGroup.add(myLinkFeedback); form.add(formGroup); ,因为有时当我没有使用它时,我得到的信息,相同的字母不一样。

但是......我知道可以通过assertDictEqual运算符比较dicts:

==

我实际上可能需要>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]} True

3 个答案:

答案 0 :(得分:56)

基本上,它允许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

VS。

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

  

...通常没有必要直接调用这些方法。

答案 1 :(得分:1)

我认为这是在单元测试的背景下。 assertDictEqual方法不仅会比较dicts并将其评估为True或False,还可以为您提供其他信息。比如两个dicts之间的确切差异。

此外,在一个好的IDE中,单元测试将很好地集成。您可以添加一个TestCase,使用assertDictEqual,IDE将为您找到并运行测试。然后以易于阅读的格式显示输出。这可以为您节省大量的样板代码。

与“==”相比,我会对两个相同的dicts不相等的情况非常感兴趣。

答案 2 :(得分:0)

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

为什么单元测试完全具有所有特殊断言?

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

鉴于Python是一种易于反思的动态语言,为什么还要烦恼所有这些呢?答案是“因为unitest是从Java junit包中移植的,所以这就是他们在Java中所做的(并且可能不得不这样做,因为在运行时进行自我检查会变得更加困难/不可能)。

所以我的建议是:除非您正在为标准库编写测试,否则请不要使用unittest-它所做的只是阻碍。我使用pytest,鼻子也可能是一个不错的选择。它使编写测试变得更快,更容易,并且在遇到错误时可以得到出色的报告。

它还包括许多漂亮的功能,用于参数化测试,固定装置,测试配置,模拟等...

如果您已经在使用unitest的项目中-您仍然可以使用pytest运行测试,并获得其许多优势。