我正在阅读关于PyTest的文档和博客,但是在运行测试时,我找不到一个很好的解释为什么要使用@pytest.mark.parametrize而不是多个assert语句。为什么要用一个对另一个?如果有mark.parametrize,那么使用它有什么好处呢?
我遇到了另一个测试框架的评论,其中提到参数化可以继续运行所有参数,而不是在第一次失败时停止运行,但是我测试了这一点,而对于PyTest来说似乎并非如此:
def summing(x, y):
return x + y
def test_summing():
assert summing(1, 2) == 3
assert summing(3, 4) == 8
assert summing(4, 5) == 9
@pytest.mark.parametrize('x, y, result', [(1, 2, 3), (3, 4, 8), (4, 5, 9)])
def test_summing_param(x, y, result):
assert summing(x, y) == result第二个测试失败后,这两个测试都停止了。
$ pytest param_test.py
========================= test session starts ==========================
platform linux -- Python 3.8.5, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: /home/coni/src/Scraping
collected 4 items
param_test.py F.F. [100%]
=============================== FAILURES ===============================
_____________________________ test_summing _____________________________
def test_summing():
assert summing(1, 2) == 3
> assert summing(3, 4) == 8
E assert 7 == 8
E + where 7 = summing(3, 4)
param_test.py:8: AssertionError
______________________ test_summing_param[3-4-8] _______________________
x = 3, y = 4, result = 8
@pytest.mark.parametrize('x, y, result', [(1, 2, 3), (3, 4, 8), (4, 5, 9)])
def test_summing_param(x, y, result):
> assert summing(x, y) == result
E assert 7 == 8
E + where 7 = summing(3, 4)
param_test.py:13: AssertionError
======================= short test summary info ========================
FAILED param_test.py::test_summing - assert 7 == 8
FAILED param_test.py::test_summing_param[3-4-8] - assert 7 == 8
===================== 2 failed, 2 passed in 0.07s ======================发布于 2021-03-04 23:51:07
我认为使用parametrize()的最大优点是避免重复测试代码。在您的示例中,这种复制不是一个大问题,因为每个测试都只有一行。但大多数测试都没那么简单。例如,如果您使用复杂的输入测试一个函数,那么设置这些输入可能需要几行代码。或者,如果要使用复杂的输出测试函数,则可能需要断言有关这些输出的几点内容。如果在这种情况下不使用parametrize(),那么您最终会一次又一次地为每一组输入和输出编写相同的代码,这有很多缺点:很难阅读测试,很难重构测试,很容易在测试用例之间引入细微的差异,等等。
除了上述之外,使用参数还有一些附带的好处,值得一提的是:
https://stackoverflow.com/questions/66481583
复制相似问题