【发布时间】:2012-02-14 04:58:16
【问题描述】:
我有一个 Python 单元测试,其中一些测试测试了相同类型的对象。一个测试类的基本大纲是:
class TestClass(unittest.TestCase):
def setup(self):
...
def checkObjects(self, obj):
for i in [...values...]:
self.assertEqual(starttags(i,obj), endtags(i,obj))
def testOne(self):
#Get object one.
checkObjects(objone)
def testAnother(self):
#Access another object.
checkObjects(another)
... various tests for similar objects.
虽然它是模块化的,但我注意到任何失败都会产生类似 AssertionError: number != anothernumber 之类的错误,以及生成错误的代码行self.assertEqual(starttags(i,obj), endtags(i,obj))。如果我列出了测试而不是放在 for 循环中,我会有类似的东西:
self.assertEqual(starttags(value1,obj), endtags(value1,obj))
self.assertEqual(starttags(value2,obj), endtags(value2,obj))
它准确显示了哪种情况导致了错误,但是是复制粘贴代码,我认为通常不推荐这样做。我最近注意到了这个问题,当一名贡献者重新设计了一个更clean 的单元测试时,不幸的是,它几乎不会提供关于断言失败的调试信息。那么,在这些情况下,最佳实践是什么?像元组列表这样的东西,用 assertEquals 送入 for 循环是“更干净”的,但是在不同的行上复制粘贴不同的值会提供有用的堆栈跟踪。
【问题讨论】:
-
解决此问题的一种方法是将错误消息添加到
self.assertEqual调用。说:self.assertEqual(starttags(i,obj), endtags(i,obj), message)其中 message 是一个详细的字符串,其中包含object 的字符串表示形式、测试失败的i的值等。 -
这似乎是这个问题的答案
标签: python unit-testing assert