为什么unittest中的断言使用TestCase.assertEqual而不是assert关键字?

Ste*_*lie 38 python unit-testing

Python的内置unittest模块使用TestCase.assert*方法进行断言:

class FooTest(TestCase):
    def test_foo(self):
        self.assertEqual(1,1)
        self.assertNotEqual(1,2)
        self.assertTrue(True)
Run Code Online (Sandbox Code Playgroud)

我通常使用一个testrunner,如nosepy.test,它允许assert在进行断言时使用内置关键字:

assert 1 == 1
assert 1 != 2
assert True
Run Code Online (Sandbox Code Playgroud)

unittest TestCase.assert*方法的动机是什么,以及使用内置assert关键字断言的优点和缺点是什么?有没有理由说为什么单元测试的语法应该受到青睐?

Tho*_*ers 25

assert关键字的问题在于,当Python以"优化"模式运行时(使用参数或设置了环境变量),它被优化,因此被忽略.如果要使用测试,那么测试将是不可能的.-OPYTHONOPTIMIZEassert-O

另外,断言方法的使用使得报告实际所涉及的值是多么微不足道,而不必深入研究堆栈和源,并弄清楚它们应该是什么(我相信,这是技术nosepy.test用于此.)

  • 如果你没有像在生产中运行它那样测试代码,那么你就没有做到正确.测试框架不是决定你不应该在生产中使用`-O`的东西(尽管你可能不应该这样做.) (9认同)
  • 如果您正在测试代码,则可能无法在优化模式下运行它. (8认同)
  • +1,尽管我怀疑有人会使用“-O”开关运行单元测试。 (3认同)
  • JBernardo:恭敬地不同意 - 曾经有过在Debug中运行良好的代码但在Release(或者反之)中表现得很好吗?它可能会发生,在大多数情况下,您应该尽可能接近最终环境进行测试. (2认同)

小智 6

我没有看到具体的设计决策。查看单元测试文档,它指出

将调用特定于类型的相等函数以生成更有用的默认错误消息

所以我想说这是一个实施决策,有助于产生更有意义的错误等。