在 Python 的 unit test 中框架可以使用 expectedFailure
声明测试预计会失败装饰器。我使用“预期失败”来表示实现中需要稍后修复的错误,但并不重要。但是,expcetedFailure
装饰器适用于整个测试。我想知道是否有办法声明一个 sub-test预计会失败?
例如,考虑以下针对未将 2
声明为质数的 is_prime
例程的测试(可能是因为它首先过滤掉所有偶数):
class NumbersTest(unittest.TestCase):
def test_primes(self):
for i in range(2, 13):
with self.subTest(i=i):
if i in [2, 3, 5, 7, 11]:
self.assertTrue(is_prime(i))
else:
self.assertFalse(is_prime(i))
由于 is_prime
中的错误,i=2
的测试显然失败了,但我确信现在我永远不会调用 is_prime
在 2
上,我暂时不会大惊小怪。我想有一种方法来声明只有 i=2
的子测试预计会失败。如果我用 @expectedFailure
装饰整个 test_primes
那么这个例程根本不会被测试,所以如果有人改变了实现并破坏了它的功能,它就不会被注意到。
一种可能是使用 skipTest
相反:
class NumbersTest(unittest.TestCase):
def test_primes(self):
for i in range(2, 13):
with self.subTest(i=i):
if i == 2:
self.skipTest("`is_prime` does not handle 2 correctly")
if i in [2, 3, 5, 7, 11]:
self.assertTrue(is_prime(i))
else:
self.assertFalse(is_prime(i))
但我对跳过测试不太满意,因为如果无法执行测试(例如,由于资源不可用等),通常应该跳过该测试。在这种情况下,没有什么可以阻止我们为 i==2
运行测试,它只会失败,并且失败是一个已知错误。
最佳答案
我意识到这有点过时了,但是如果您可以将测试重构为接受输入的方法,则可以通过最少的重复实现这一目标
class NumbersTest(unittest.TestCase):
def test_primes(self):
for i in range(2, 13):
with self.subTest(i=i):
if i in [2, 3, 5, 7, 11]:
self.assertTrue(is_prime(i))
else:
self.assertFalse(is_prime(i))
成为
class NumbersTest(unittest.TestCase):
def _test_primes(self, i, expectation):
with self.subTest(i=i, expectation=expectation):
self.assertEqual(is_prime(i), expectation)
@unittest.expectedFailure
def test_failing_primes(self):
values = [2]
for i in values:
self._test_primes(i, False)
def test_primes(self):
for i in range(3, 13):
if i in [3, 5, 7, 11]:
self._test_primes(i, True)
else:
self._test_primes(i, False)
关于python - 是否可以在 Python 单元测试中进行子测试 "expected failure"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60883242/