编辑: 切换到一个更好的例子,并澄清为什么这是一个真正的问题。
我希望用 Python 编写单元测试,当断言失败时继续执行,这样我就可以在一个测试中看到多个失败。例如:
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
这里,测试的目的是确保 Car 的 __init__
正确设置字段。我可以把它分成四个方法(这通常是个好主意) ,但是在这种情况下,我认为将它作为一个单独的方法来测试一个单独的概念(“对象被正确地初始化”)更具可读性。
如果我们假设最好不要在这里分解这个方法,那么我就有了一个新问题: 我不能一次看到所有的错误。当我修复 model
错误并重新运行测试时,就会出现 wheel_count
错误。当我第一次运行测试时,这将节省我查看这两个错误的时间。
作为比较,Google 的 C + + 单元测试框架 区分介于非致命的 EXPECT_*
断言和致命的 ASSERT_*
断言之间:
断言是成对出现的,它们测试相同的内容,但是对当前函数有不同的影响。ASSERT _ * 版本在失败时会生成致命的失败,并中止当前函数。EXPECT _ * 版本会生成非致命故障,这些故障不会中止当前函数。通常 EXPECT _ * 是首选的,因为它们允许在测试中报告多个失败。但是,如果在有问题的断言失败时继续使用 ASSERT _ * 没有意义,那么应该使用 ASSERT _ * 。
有没有办法在 Python 的 unittest
中获得类似 EXPECT_*
的行为?如果在 unittest
中没有,那么是否有另一个 Python 单元测试框架支持这种行为?
顺便说一句,我很好奇有多少实际测试可以从非致命断言中受益,所以我看了一些 代码示例(编辑于2014-08-19,使用搜索代码代替 Google Code Search,RIP)。从第一页随机选择的10个结果中,都包含在同一个测试方法中作出多个独立断言的测试。所有这些都将受益于非致命断言。