python-3.x 使用子测试区分测试迭代的pytest等价物是什么

ymdaylpp  于 2023-01-14  发布在  Python
关注(0)|答案(1)|浏览(139)

使用子测试区分测试迭代

class NumbersTest(unittest.TestCase):

    def test_even(self):
        """
        Test that numbers between 0 and 5 are all even.
        """
        for i in range(0, 6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

输出:

FAIL: test_even (__main__.NumbersTest) (i=1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 32, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest) (i=3)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 32, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest) (i=5)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 32, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

如果不使用子测试,则在第一次失败后执行将停止,并且错误将不太容易诊断,因为i的值将不会显示。
当我使用pytest运行上面的代码时,我看不到哪个测试失败了,pytest不支持这个特性吗?

rjjhvcjd

rjjhvcjd1#

你应该考虑参数化测试,而不是在测试用例中运行for循环。这是pytest为不同的输入值生成同一测试的多个示例的方式。
https://docs.pytest.org/en/stable/parametrize.html
该页中的第一个示例显示:

import pytest

@pytest.mark.parametrize(
    "test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)]
)
def test_eval(test_input, expected):
    assert eval(test_input) == expected

运行时,调用test_eval三次,如下所示:

test_eval(test_input="3+5", expected=8)
test_eval(test_input="2+4", expected=6)
test_eval(test_input="6*9", expected=42)

与unittestsubTests类似,如果这些调用中的任何一个失败,其他调用仍然会运行。

相关问题