老实说,我一直使用 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
?
答案 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运行测试,并获得其许多优势。