Pytest fixture di passaggio in parametrizza
Ricevo l'errore seguente passando il mio dispositivo definito in conftest.py in @ 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)
Se sto passando un elenco al test come dispositivo come:
def test_ra_start_time(self, alist):
for channel in alist:
print(channel)
Funziona bene, ma non funziona con il passaggio a @ pytest.mark.parametrize
Risposte
Come accennato nel commento, non è possibile passare direttamente un dispositivo a un mark.parametrizedecoratore, perché il decoratore viene valutato al momento del caricamento.
Puoi invece eseguire la parametrizzazione in fase di esecuzione implementando 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
La parametrizzazione avviene in base alla presenza del alistparametro nella funzione di test. Affinché la parametrizzazione funzioni, questo parametro è necessario (altrimenti si otterrebbe un errore a causa dell'argomento mancante).