web-dev-qa-db-fra.com

pytest utilisant des appareils comme arguments dans le paramétrage

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.

21
elveatles

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.

8
Will

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 .

4
Robie Basak

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.

3
elveatles