parametrize에서 pytest 픽스처 전달

Dec 14 2020

@ pytest.mark.parametrize의 conftest.py에 정의 된 고정 장치를 전달하여 다음 오류가 발생합니다.

pytest --alist="0220,0221" test_1.py -v -s
NameError: name 'alist' is not defined

conftest.py :

def pytest_addoption(parser):
    parser.addoption("--alist", action="store")

@pytest.fixture
def alist(request):
    return request.config.getoption("--alist").split(",")

test_1.py :

@pytest.mark.parametrize("channel", alist, scope="class")
class TestRaIntegrationReplay:

    def test_ra_start_time(self, channel):
        print(channel)

내가 다음과 같이 픽스쳐로 테스트에 alist를 통과한다면 :

    def test_ra_start_time(self, alist):
        for channel in alist:
            print(channel)

잘 작동하지만 @ pytest.mark.parametrize에 전달하면 작동하지 않습니다.

답변

1 MrBeanBremen Dec 15 2020 at 00:01

주석에서 언급했듯이 mark.parametrize, 데코레이터는로드 시간에 평가되기 때문에 조명기를 데코레이터에 직접 전달할 수 없습니다 .
대신 다음을 구현하여 런타임에 매개 변수화를 수행 할 수 있습니다 pytest_generate_tests.

import pytest

@pytest.hookimpl
def pytest_generate_tests(metafunc):
    if "alist" in metafunc.fixturenames:
        values = metafunc.config.option.alist
        if value is not None:
            metafunc.parametrize("alist", value.split(","))

def test_ra_start_time(alist):
    for channel in alist:
        print(channel)

def test_something_else():
    # will not be parametrized
    pass

매개 변수화는 alist테스트 기능에서 매개 변수 의 존재를 기반으로 수행 됩니다. 매개 변수화가 작동하려면이 매개 변수가 필요합니다. 그렇지 않으면 인수가 누락되어 오류가 발생합니다.