Passage du luminaire Pytest dans le paramétrage

Dec 14 2020

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

1 MrBeanBremen Dec 15 2020 at 00:01

Comme mentionné dans le commentaire, vous ne pouvez pas passer directement un luminaire à un mark.parametrizedé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 alistparamè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).