我不同意主流观点,即应该为每个断言编写一个测试方法。在某些情况下,您希望在一个测试方法中检查多个内容。下面是我的答案:# Works with unittest in Python 2.7
class ExpectingTestCase(unittest.TestCase):
def run(self, result=None):
self._result = result
self._num_expectations = 0
super(ExpectingTestCase, self).run(result)
def _fail(self, failure):
try:
raise failure
except failure.__class__:
self._result.addFailure(self, sys.exc_info())
def expect_true(self, a, msg):
if not a:
self._fail(self.failureException(msg))
self._num_expectations += 1
def expect_equal(self, a, b, msg=''):
if a != b:
msg = '({}) Expected {} to equal {}. '.format(self._num_expectations, a, b) + msg
self._fail(self.failureException(msg))
self._num_expectations += 1
以下是一些我认为有用而不冒险的情况:
1)当您要测试不同数据集的代码时。这里我们有一个add()函数,我想用几个示例输入来测试它。为3个数据集编写3个测试方法意味着重复自己的工作,这是不好的。尤其是如果电话更详细的话class MyTest(ExpectingTestCase):
def test_multiple_inputs(self):
for a, b, expect in ([1,1,2], [0,0,0], [2,2,4]):
self.expect_equal(expect, add(a,b), 'inputs: {} {}'.format(a,b))
2)要检查函数的多个输出时。我想检查每个输出,但我不希望第一次失败就掩盖了其他两个。class MyTest(ExpectingTestCase):
def test_things_with_no_side_effects(self):
a, b, c = myfunc()
self.expect_equal('first value', a)
self.expect_equal('second value', b)
self.expect_equal('third value', c)
3)测试安装成本高的东西。测试必须快速运行,否则人们将停止使用它们。有些测试需要一个数据库或网络连接,这需要一秒钟的时间,这会降低您的测试速度。如果您正在测试数据库连接本身,那么您可能需要进行速度测试。但是如果你在测试一些不相关的东西,我们希望为一整套检查做一次缓慢的设置。