gpt4 book ai didi

python - Pytest 使用参数化 fixture VS。 pytest.mark.parametrize

转载 作者:行者123 更新时间:2023-12-04 10:32:06 24 4
gpt4 key购买 nike

我正在使用 Pytest 编写一些单元测试,并遇到了两种参数化测试输入的方法。一种是使用参数化装置,另一种是使用 pytest.mark.parametrize方法。

我的两个例子是:

# method 1
def tokens():
yield from ["+", "*", "?"]

@pytest.mark.parametrize("token", tokens())
def test_stuff(token):
assert stuff



# method 2
@pytest.fixture(params=["+", "*", "?"])
def token(request):
return request.param

def test_stuff(token):
assert stuff

据我所知,两者都有不同的优点和缺点:

方法一

好处
  • 支持多参数
  • 支持惰性求值

  • 缺点
  • 用于多种测试方法时更多样板代码
  • 需要为使用的每个方法显式参数映射,即使参数名称相同

  • 方法二

    好处
  • 少锅炉板代码

  • 缺点
  • 只允许将单个参数传递给单元测试

  • 我还是 PyTest 的新手,所以也许有一种方法可以解决我上面为每种方法列出的缺点,但考虑到这些缺点,我一直很难决定使用哪种方法。我猜想做我想做的事情的预期方法是使用 @pytest.mark.parametrize但是当通过使用 fixture 仅传递具有较少样板代码的单个参数时似乎是一个很大的优势。谁能告诉我不这样做的理由,或者这是一个完全有效的用例吗?

    最佳答案

    pk786在他的评论中提到,你应该使用一个固定装置“......如果你有一些东西要为测试设置和拆卸,或者使用()相同的数据集进行多个测试然后使用固定装置”。
    例如,您可能希望加载在不同测试函数中进行测试的多个数据集。使用 fixture 允许您只加载一次这些数据集并在测试函数中共享它们。您可以使用 params @pytest.fixture 的论据加载和缓存每个数据集。然后,使用这些装置的测试函数将针对每个加载的数据集运行。在代码中,这可能类似于:

    import json

    import pytest


    test_files = ["test_file1.json", "test_file2.json"]


    @pytest.fixture(params=test_files)
    def example_data(request):
    with open(request.param, "r") as f:
    data = json.load(f)
    return data


    def test_function1(example_data):
    # run test with example data.
    # this test will be run once for each file in the list `test_files` above.
    ...


    def test_function2(example_data):
    # run a different test with example data.
    # this test will be run once for each file in the list `test_files` above.
    # this test takes advantage of automatic caching mechanisms of fixtures...
    # ...so that data is not loaded again.
    ...
    或者,如 pk786状态,“如果您只使用一组数据一次,那么@pytest.mark.parametrize 应该是方法”。
    此声明适用于您提供的示例,因为您没有在需要跨测试共享的 fixture 中执行任何设置。在这种情况下,即使您在多个测试中使用“ token ”,我也会考虑用 @pytest.mark.parameterize 装饰每个函数。因为我相信这种方法更明确地说明了您的意图,并且对于阅读您代码的其他人来说更容易理解。这看起来像这样:
    ...

    def tokens():
    yield from ["+", "*", "?"]


    @pytest.mark.parametrize("token", tokens())
    def test_stuff(token):
    assert stuff


    @pytest.mark.parametrize("token", tokens())
    def test_other_stuff(token)
    assert other_stuff

    关于python - Pytest 使用参数化 fixture VS。 pytest.mark.parametrize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60369047/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com