Me gustaría usar accesorios 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 == expectedEl 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 usarán según la prueba.
Si está en pytest 3.0 o posterior, creo que debería poder resolver este escenario en particular escribiendo un accesorio como:
@pytest.fixture(params=['dir1_fixture', 'dir2_fixture']) def dirname(request): return request.getfixturevalue(request.param)Documentos aquí: http://doc.pytest.org/en/latest/builtin.html#_pytest.fixtures.FixtureRequest.getfixturevalue
Sin embargo, no puede usar este enfoque si el dispositivo que intenta cargar dinámicamente está parametrizado.
Alternativamente, es posible que pueda resolver algo con el enlace pytest_generate_tests. Sin embargo, no he sido capaz de obligarme a investigar tanto.
Will estaba en el camino correcto , debe usar request.getfixturevalue para recuperar el accesorio.
Pero puedes hacerlo bien en la prueba, que es más sencilla.
@pytest.mark.parametrize('dirname, expected', [ ('dir1_fixture', 'expected1'), ('dir2_fixture', 'expected2')]) def test_directory_command(dirname, expected, request): result = my_package.directory_command(request.getfixturevalue(dirname)) assert result == expectedOtra forma es usar el complemento perezoso :
@pytest.mark.parametrize('dirname, expected', [ (pytest.lazy_fixture('dir1_fixture'), 'expected1'), (pytest.lazy_fixture('dir2_fixture'), 'expected2')]) def test_directory_command(dirname, expected): result = my_package.directory_command(dirname) assert result == expectedPor 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 == expectedNo es el mejor ya que no usa una solución integrada en pytest, pero funciona para mí.