Passing Pytest Fixture in parametrize

Dec 14 2020

Ich erhalte folgenden Fehler, wenn ich mein in conftest.py in @ pytest.mark.parametrize definiertes Gerät übergebe:

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)

Wenn ich als Gerät wie folgt an den Test gehe:

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

Es funktioniert gut, aber es funktioniert nicht mit der Übergabe an @ pytest.mark.parametrize

Antworten

1 MrBeanBremen Dec 15 2020 at 00:01

Wie im Kommentar erwähnt, können Sie ein Gerät nicht direkt an einen mark.parametrizeDekorateur übergeben, da der Dekorateur beim Laden ausgewertet wird.
Sie können die Parametrisierung stattdessen zur Laufzeit durchführen, indem Sie Folgendes implementieren 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

Die Parametrisierung erfolgt basierend auf dem Vorhandensein des alistParameters in der Testfunktion. Damit die Parametrisierung funktioniert, wird dieser Parameter benötigt (andernfalls wird aufgrund des fehlenden Arguments ein Fehler angezeigt).