Pasando el accesorio pytest en parametrize

Dec 14 2020

Recibo el siguiente error al pasar mi accesorio definido en conftest.py en @ 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 estoy pasando una lista a la prueba como accesorio como:

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

Funciona bien, pero no funciona pasando a @ pytest.mark.parametrize

Respuestas

1 MrBeanBremen Dec 15 2020 at 00:01

Como se menciona en el comentario, no puede pasar directamente un accesorio a un mark.parametrizedecorador, porque el decorador se evalúa en el momento de la carga.
Puede realizar la parametrización en tiempo de ejecución 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 parametrización se realiza en función de la presencia del alistparámetro en la función de prueba. Para que la parametrización funcione, se necesita este parámetro (de lo contrario, obtendría un error debido al argumento que falta).