Passage du luminaire Pytest dans le paramétrage
J'obtiens l'erreur suivante en passant mon appareil défini dans conftest.py dans @ 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)
Si je passe une liste au test en tant que montage comme:
def test_ra_start_time(self, alist):
for channel in alist:
print(channel)
Cela fonctionne bien, mais cela ne fonctionne pas avec le passage à @ pytest.mark.parametrize
Réponses
Comme mentionné dans le commentaire, vous ne pouvez pas passer directement un luminaire à un mark.parametrize
décorateur, car le décorateur est évalué au moment du chargement.
Vous pouvez effectuer le paramétrage au moment de l'exécution à la place en implémentant 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
Le paramétrage se fait en fonction de la présence du alist
paramètre dans la fonction de test. Pour que le paramétrage fonctionne, ce paramètre est nécessaire (sinon, vous obtiendrez une erreur en raison de l'argument manquant).