2017-02-02 14 views
5

Chciałbym użyć urządzeń jako argumentów pytest.mark.parametrize lub czegoś, co miałoby takie same wyniki.pytest używający urządzeń jako argumentów w parametrize

Na przykład:

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 

Problem z terminarza params jest to, że każdy param oprawy będzie się uruchamiać za każdym razem, gdy jest używany, ale nie chcę tego. Chcę móc wybrać, które urządzenia będą używane w zależności od testu.

Odpowiedz

0

Na razie moim jedynym rozwiązaniem jest stworzenie urządzenia, które zwróci słownik urządzeń.

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 

Nie najlepiej, ponieważ nie korzysta z rozwiązania wbudowanego w pytest, ale działa dla mnie.

3

Jeśli jesteś na pytest 3.0 lub nowszej, myślę, że powinieneś być w stanie rozwiązać ten konkretny scenariusz pisząc uchwytu wzdłuż linii:

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

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

Jednak nie można użyć tego podejścia, jeśli urządzenie, które próbujesz dynamicznie ładować, jest parametryzowane.

Alternatywnie możesz być w stanie wykombinować coś za pomocą haka pytest_generate_tests. Jednak nie byłem w stanie zmusić się, by zajrzeć tak dużo.

+0

Dziękuję za odpowiedź, ale nie jest to dokładnie to, czego szukam. Z tego co wiem, urządzenie dirname będzie uruchamiało każde urządzenie pojedynczo. To, czego szukam, to sposób na wybranie urządzenia z testu opartego na parametrach. – elveatles

+0

Nie jestem pewien, czy podążam za tym, czego szukasz. Niemniej jednak, jeśli masz jakąś logikę, którą chciałbyś wykonać w swoim przypadku testowym, która określa wymaganą konfigurację, możesz zamiast tego dynamicznie ładować urządzenie przez request.getfixturevalue(). – Will

Powiązane problemy