pytest usando aparatos como argumentos en parametrizar

Me gustaría usar los aparatos como argumentos de pytest.mark.parametrize o algo que tenga los mismos resultados.

Por ejemplo:

 import pytest import my_package @pytest.fixture def dir1_fixture(): return '/dir1' @pytest.fixture def dir2_fixture(): return '/dir2' @pytest.parametrize('dirname, expected', [(dir1_fixture, 'expected1'), (dir2_fixture, 'expected2')] def test_directory_command(dirname, expected): result = my_package.directory_command(dirname) assert result == expected 

El problema con los parámetros del dispositivo es que cada parámetro del dispositivo se ejecutará cada vez que se use, pero no quiero eso. Quiero poder elegir qué accesorios se utilizarán según la prueba.

Si estás en Pytest 3.0 o posterior, creo que deberías poder resolver este escenario en particular escribiendo un elemento a lo largo de las líneas de:

 @pytest.fixture(params=['dir1_fixture', 'dir2_fixture']) def dirname(request): return request.getfixturevalue(request.param) 

Docs aquí: http://doc.pytest.org/en/latest/builtin.html#_pytest.fixtures.FixtureRequest.getfixturevalue

Sin embargo, no puede utilizar este enfoque si el dispositivo que está intentando cargar dinámicamente está parametrizado.

Alternativamente, puede ser capaz de resolver algo con el gancho pytest_generate_tests. Sin embargo, no he podido convencerme mucho de eso.

Esto no está soportado actualmente por pytest. Sin embargo, hay una solicitud de función abierta para él: https://github.com/pytest-dev/pytest/issues/349 .

Por ahora, mi única solución es crear un accesorio que devuelva un diccionario de accesorios.

 import pytest import my_package @pytest.fixture def dir1_fixture(): return '/dir1' @pytest.fixture def dir2_fixture(): return '/dir2' @pytest.fixture def dir_fixtures( dir1_fixture, dir2_fixture ): return { 'dir1_fixture': dir1_fixture, 'dir2_fixture': dir2_fixture } @pytest.mark.parametrize('fixture_name, expected', [('dir1_fixture', 'expected1'), ('dir2_fixture', 'expected2')] def test_directory_command(dir_fixtures, fixture_name, expected): dirname = dir_fixtures[fixture_name] result = my_package.directory_command(dirname) assert result == expected 

No es el mejor ya que no usa una solución integrada en pytest, pero funciona para mí.