2017-02-02 4 views
5

Ich möchte Fixtures als Argumente von pytest.mark.parametrize oder etwas, das die gleichen Ergebnisse haben würde verwenden.pytest mit Fixtures als Argumente in parametrize

Zum Beispiel:

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 

Das Problem mit Halterung params ist, dass jeder param des Scheinwerfers wird jedes Mal, es gewöhnen laufen, aber ich will das nicht. Ich möchte wählen können, welche Geräte je nach Test verwendet werden.

Antwort

0

Im Moment ist meine einzige Lösung, ein Fixture zu erstellen, das ein Wörterbuch von Fixtures zurückgibt.

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 

Nicht die beste, da es keine Lösung in pytest gebaut nicht verwendet, aber es funktioniert für mich.

3

Wenn Sie auf pytest 3.0 oder später, ich glaube, Sie sollten dieses speziellen Szenario lösen können, durch eine Befestigung entlang der Linien des Schreibens:

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

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

Sie können diese Methode jedoch nicht verwenden, wenn das Gerät, das Sie dynamisch laden möchten, parametrisiert ist.

Alternativ können Sie etwas mit dem pytest_generate_tests-Hook herausfinden. Ich bin jedoch nicht in der Lage, mich dazu zu bringen, so viel zu sehen.

+0

Vielen Dank für Ihre Antwort, aber das ist nicht genau das, wonach ich suche. Soweit ich weiß, wird das Gerät "dirname" jedes Gerät einzeln nacheinander ausführen. Nach was ich suche, ist eine Weise, eine Befestigung von einem Test zu wählen, der auf Parametern basiert. – elveatles

+0

Ich bin mir nicht sicher, ob ich dem folge, wonach Sie suchen. Wenn Sie jedoch eine Art von Logik haben, die Sie lieber in Ihrem Testfall ausführen möchten, der das Setup bestimmt, das Sie benötigen, können Sie das Fixture stattdessen dynamisch über request.getfixturevalue() von dort laden. – Will

Verwandte Themen