Mengoper perlengkapan pytest di parametrize

Dec 14 2020

Saya mendapatkan kesalahan berikut dengan meneruskan fixture saya yang ditentukan di conftest.py di @ pytest.mark.parametrize:

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)

Jika saya lulus daftar tes sebagai perlengkapan seperti:

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

Ini berfungsi dengan baik, tetapi tidak berfungsi dengan meneruskan ke @ pytest.mark.parametrize

Jawaban

1 MrBeanBremen Dec 15 2020 at 00:01

Seperti yang disebutkan dalam komentar, Anda tidak dapat langsung meneruskan perlengkapan ke mark.parametrizedekorator, karena dekorator dievaluasi pada waktu muat.
Anda dapat melakukan parametrization pada waktu proses sebagai gantinya dengan menerapkan 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

alistParameterisasi dilakukan berdasarkan keberadaan parameter dalam fungsi pengujian. Agar parametrization berfungsi, parameter ini diperlukan (jika tidak, Anda akan mendapatkan kesalahan karena argumen yang hilang).