快速解决方案将是,以提供检查正确性一个混合:
import unittest
class Mixin(object):
def assertTrue(self, *args, **kwargs):
if len(args) > 1:
# TypeError is just an example, it could also do some warning/logging
# stuff in here.
raise TypeError('msg should be given as keyword parameter.')
super().assertTrue(*args, **kwargs)
class TestMixin(Mixin, unittest.TestCase): # Mixin before other parent classes
def test_two_things_equal(self):
self.assertTrue("a", "b")
的密新还可以检查是否传递表达是一个布尔:
class Mixin(object):
def assertTrue(self, *args, **kwargs):
if type(args[0]) is bool:
raise TypeError('expression should be a boolean')
if len(args) > 1:
raise TypeError('msg should be given as keyword parameter.')
super().assertTrue(*args, **kwargs)
但是,这不是静态的,它需要手动更改测试类(添加Mixin)并运行测试。此外,它会抛出大量的误报,因为将消息作为关键字参数传递并不常见(至少不是我见过的),并且在很多情况下,您想要检查表达式的隐含真实性而不是显式的bool
。要检查不-空虚if a
时a
是list
,dict
等
你也可以使用一些setUp
,teardown
代码,改变了特定类的assertTrue
方法:
import unittest
def decorator(func):
def wrapper(*args, **kwargs):
if len(args) > 1:
raise TypeError()
return func(*args, **kwargs)
return wrapper
class TestMixin(unittest.TestCase):
def setUp(self):
self._old = self.assertTrue
self.assertTrue = decorator(self.assertTrue)
def tearDown(self):
self.assertTrue = self._old
def test_two_things_equal(self):
self.assertTrue("a", "b")
但谨慎使用这些方法之前的注意事项:在改变现有测试之前,务必小心谨慎。不幸的是,测试的记录有时很差,所以测试和测试的方式并不总是很明显。某些时候测试没有意义,并且可以改变它,但有时它会以奇怪的方式测试某个特定功能,当您更改测试时会改变正在测试的内容。因此,至少要确保在更改测试用例时不会发生覆盖范围变化。如有必要,请确保通过更新方法名称,方法文档或内嵌评论来阐明测试的目的。
但萎靡不振的技术上有效的代码可能会创造一个全新的不同的问题; *信息溢出*。 –
@ Ev.Kounis对,如果我们天真地接近它,可能会有很多误报。我正在考虑只强制使用'msg'作为关键字参数。在这种情况下,我们可能会通过警告消息未正确传递给断言方法来捕获此特定问题。我不太喜欢这个想法,但希望看看有没有其他的想法..谢谢。 – alecxe
我强烈建议@Leon提供的答案。通过添加你知道应该失败的测试,你会发现一个被滥用的测试用例。 –