gpt4 book ai didi

python - Pytest:仅测试参数化 fixture 的一个实例

转载 作者:行者123 更新时间:2023-12-04 16:46:08 25 4
gpt4 key购买 nike

设置

假设我有 conftest.py,我在其中定义了测试资源

class ClassifyRequest:
pass

class OCRRequest:
pass

@pytest.fixture(params=[ClassifyRequest, OCRRequest])
def api_request(request):
return request.param() # return one of the request instances

然后,在 test_api.py 中,我使用参数化 fixture 来测试服务:

def test_service(api_request):
response = send_request(api_request)
assert response.ok()

很好,但是我想测试专用 fixture api_request[ClassifyRequest]:

@pytest.mark.usefixture("api_request[ClassifyRequest]")
def test_classification():
# do something with the api_request fixture

问题

为测试函数专门化参数化 fixture 的方法是什么?我有两个想法:

  1. 只需使用非参数化 fixture 。这不可避免地会导致样板代码。
  2. 从 fixture 装饰器中移除显式参数化并使用间接参数化,例如
    @pytest.mark.parametrize("response_class", ["classify", "ocr"])
    def test_api(api_request):
    # do smth
    用字符串替换类参数等于创建两个配置源。如果我想添加另一个参数怎么办?我是否必须为它设计一个新字符串,并在 api_request fixture 中间接实例化一个对象?
  3. 相同,除了保留类参数化并将类移到 conftest.py 之外,因为 pytest 无法使用 import 语句从该模块导入名称。

附加信息

pytest==6.0.1

最佳答案

如果您的 fixture 所做的只是实例化,我会选择参数化测试,而不是 fixture 。但是,好吧,如果你必须手动专门化它,你可以简单地添加一个包装器来使 fixture 可调用:

import pytest
import types

class ClassifyRequest:
def __init__(self):
print("ClassifyRequest ctor")

class OCRRequest:
def __init__(self):
print("OCRRequest ctor")

def api_request_wrapper(request):
return request.param() # return one of the request instances

@pytest.fixture(params=[ClassifyRequest, OCRRequest])
def api_request(request):
return api_request_wrapper(request)

def test_classification():
request = types.SimpleNamespace()
request.param = ClassifyRequest
instance = api_request_wrapper(request)

虽然看起来有点老套。

关于python - Pytest:仅测试参数化 fixture 的一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63395435/

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