我正在使用Python为我的应用程序编写一些测试用例unittest
.现在我需要将一个对象列表与另一个对象列表进行比较,以检查第一个列表中的对象是否是我所期望的.
如何编写自定义.assertFoo()
方法?它该怎么办?它应该在失败时引发异常吗?如果是,哪个例外?以及如何传递错误信息?错误消息应该是unicode字符串还是字节串?
不幸的是,官方文档没有解释如何编写自定义断言方法.
如果你需要一个真实的例子,继续阅读.
我写的代码有点像这样:
def assert_object_list(self, objs, expected):
for index, (item, values) in enumerate(zip(objs, expected)):
self.assertEqual(
item.foo, values[0],
'Item {0}: {1} != {2}'.format(index, item.foo, values[0])
)
self.assertEqual(
item.bar, values[1],
'Item {0}: {1} != {2}'.format(index, item.bar, values[1])
)
def test_foobar(self):
objs = [...] # Some processing here
expected = [
# Expected values for ".foo" and ".bar" for each object
(1, 'something'),
(2, 'nothing'),
]
self.assert_object_list(objs, expected)
Run Code Online (Sandbox Code Playgroud)
这种方法使得以非常紧凑的方式描述每个对象的期望值非常容易,并且无需实际创建完整对象.
但是......当一个对象未通过断言时,不会比较其他对象,这会使调试变得更加困难.我想编写一个自定义方法,无条件地比较所有对象,然后显示所有失败的对象,而不是只显示第一个.
我正在寻找一种在PyTest中运行所有单元测试的方法,即使其中一些测试失败了.我知道必须有一个简单的方法来做到这一点.我检查了CLi选项,并通过这个网站查找类似的问题/答案,但没有看到任何东西.对不起,如果已经回答了这个问题.
例如,请考虑以下代码片段,其中包含PyTest代码:
def parrot(i):
return i
def test_parrot():
assert parrot(0) == 0
assert parrot(1) == 1
assert parrot(2) == 1
assert parrot(2) == 2
Run Code Online (Sandbox Code Playgroud)
默认情况下,执行在第一次失败时停止:
$ python -m pytest fail_me.py
=================== test session starts ===================
platform linux2 -- Python 2.7.10, pytest-2.9.1, py-1.4.31, pluggy-0.3.1
rootdir: /home/npsrt/Documents/repo/codewars, inifile:
collected 1 items
fail_me.py F
=================== FAILURES ===================
___________________ test_parrot ___________________
def test_parrot():
assert parrot(0) == 0
assert parrot(1) == 1
> assert parrot(2) == 1
E assert 2 == 1
E + where …
Run Code Online (Sandbox Code Playgroud) 我刚刚读完了Roy Osherove的"单元测试艺术",我正在努力坚持他在书中列出的最佳实践.其中一个最佳实践是不在测试方法中使用多个断言.这个规则的原因对我来说相当清楚,但它让我怀疑......
如果我有一个像这样的方法:
public Foo MakeFoo(int x, int y, int z)
{
Foo f = new Foo();
f.X = x;
f.Y = y;
f.Z = z;
return f;
}
Run Code Online (Sandbox Code Playgroud)
我是否真的必须编写单独的单元测试以声明Foo的每个单独属性是否使用提供的值进行初始化?在测试方法中使用多个断言真的很少见吗?
仅供参考:我正在使用MSTest.
编辑:感谢所有的回复.我想我最终将继续使用多个断言.在我的情况下,正在测试的行为是MakeFoo制作一个合适的Foo.因此断言每个属性都达到预期值就足够了.但是,如果设置其中一个属性存在条件,那么我将分别测试每个单独的结果.
我仍然不喜欢它....我喜欢每次测试一个断言的想法是你知道测试失败的确切原因.如果您解决了问题,那么测试将通过.有多个断言,您没有相同的保证.如果你修复了失败的断言所提到的问题,那么在测试中的下一次失败就没有什么可以阻止另一个断言了.如果断言被分开,那么你从一开始就知道两个失败.
最后,我不仅仅使用.Equals()的原因是因为在我的情况下,Foo是一个LINQ-To-SQL实体,它引入了一些不值得进入的并发症.
再次感谢.
我正在评估自动系统测试的"测试框架"; 到目前为止,我正在寻找一个python框架.在py.test或鼻子中,我看不到类似于我从谷歌测试框架中知道的EXPECT宏.我想在一次测试中做出几个断言,而不是在第一次失败时中止测试.我在这些框架中遗漏了什么,或者这不起作用?有没有人对可用于自动化系统测试的python测试框架有什么建议?