首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于pytest,在测试中使用参数而不是多个assert语句有什么好处?

对于pytest,在测试中使用参数而不是多个assert语句有什么好处?
EN

Stack Overflow用户
提问于 2021-03-04 19:14:56
回答 1查看 224关注 0票数 0

我正在阅读关于PyTest的文档和博客,但是在运行测试时,我找不到一个很好的解释为什么要使用@pytest.mark.parametrize而不是多个assert语句。为什么要用一个对另一个?如果有mark.parametrize,那么使用它有什么好处呢?

我遇到了另一个测试框架的评论,其中提到参数化可以继续运行所有参数,而不是在第一次失败时停止运行,但是我测试了这一点,而对于PyTest来说似乎并非如此:

代码语言:javascript
复制
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

第二个测试失败后,这两个测试都停止了。

代码语言:javascript
复制
$ 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 ======================
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-04 23:51:07

我认为使用parametrize()的最大优点是避免重复测试代码。在您的示例中,这种复制不是一个大问题,因为每个测试都只有一行。但大多数测试都没那么简单。例如,如果您使用复杂的输入测试一个函数,那么设置这些输入可能需要几行代码。或者,如果要使用复杂的输出测试函数,则可能需要断言有关这些输出的几点内容。如果在这种情况下不使用parametrize(),那么您最终会一次又一次地为每一组输入和输出编写相同的代码,这有很多缺点:很难阅读测试,很难重构测试,很容易在测试用例之间引入细微的差异,等等。

除了上述之外,使用参数还有一些附带的好处,值得一提的是:

  • 有时在测试之间重用参数很有用。
  • 使从外部源(例如配置文件)加载测试变得更容易。有时,在YAML中测试用例可以比python更简洁地指定。
  • 降低了添加更多测试的门槛,我发现这会导致一个更完整的测试套件。
  • 会给出更好的输出,说明导致测试失败的输入。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66481583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档