python - 是否可以在 Python 单元测试中进行子测试 "expected failure"?

标签 python python-unittest

在 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_prime2 上,我暂时不会大惊小怪。我想有一种方法来声明只有 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/

相关文章:

Python unittest __del__ 模块行为

python - Numpy 数组操作太慢 np.asarray()

python - 通知用户运行unittest时是否引发特定异常

python - 使用 py.test 但在命令行上排除测试列表?

python - 使用Python或Excel vba将单个Excel单元格内容拆分为不同的单元格

python - unittest.TestCase.assertEqual 的参数顺序

python - 使 pyunit 显示每个断言的输出

python - pygame.mixer.Sound 只播放爆裂声并退出。为什么?

python - 在 Django 中缓存站点地图

python - PyMySQL 不是从 Cron 连接,而是从控制台连接