Je voudrais utiliser des fixtures comme arguments de pytest.mark.parametrize
ou quelque chose qui aurait les mêmes résultats.
Par exemple:
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
Le problème avec les paramètres du luminaire est que chaque paramètre du luminaire sera exécuté à chaque fois qu'il sera utilisé, mais je ne le veux pas. Je veux pouvoir choisir les appareils qui seront utilisés en fonction du test.
Si vous utilisez pytest 3.0 ou une version ultérieure, je pense que vous devriez être en mesure de résoudre ce scénario particulier en écrivant un montage suivant:
@pytest.fixture(params=['dir1_fixture', 'dir2_fixture'])
def dirname(request):
return request.getfixturevalue(request.param)
Documents ici: http://doc.pytest.org/en/latest/builtin.html#_pytest.fixtures.FixtureRequest.getfixturevalue
Cependant, vous ne pouvez pas utiliser cette approche si le projecteur que vous essayez de charger dynamiquement est paramétré.
Alternativement, vous pourriez être en mesure de comprendre quelque chose avec le crochet pytest_generate_tests. Cependant, je n'ai pas pu me résoudre à approfondir cela.
Ce n'est actuellement pas pris en charge par pytest. Il existe cependant une demande de fonctionnalité ouverte: https://github.com/pytest-dev/pytest/issues/349 .
Pour l'instant, ma seule solution est de créer un appareil qui renvoie un dictionnaire d'appareils.
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
Pas le meilleur car il n'utilise pas de solution intégrée à pytest, mais ça marche pour moi.