2017-09-15 3 views
1

ich eine Testsuite mit einem pytest.fixture haben, die, wie dies auf andere Vorrichtungen abhängt:Pytest parametrisiert Test, der Befestigung verwendet

@pytest.fixture 
def params(): 
    return {'foo': 'bar', 'baz': 1} 

@pytest.fixture 
def config(): 
    return ['foo', 'bar', 'baz'] 

@pytest.client 
def client(params, config): 
    return MockClient(params, config) 

Für einen normalen Test, ich gehe nur in client und es funktioniert gut:

Aber für einen parametrisierten Test ist die Verwendung dieser Vorrichtung wirklich umständlich. Sie müssen alle Fixture-Methoden direkt aufrufen, was den Zweck in gewissem Maße zunichte macht. (Ich sollte beachten, dass die params und config Fixtures woanders verwendet werden, also möchte ich nicht einfach in client kollabieren).

@pytest.mark.parametrize('thing,expected', [ 
    (client(params(), config()).method_with_args(arg1, arg2), 100), 
    (client(params(), config()).method_with_args(arg2, arg4), 200), 
]) 
def test_parameters(thing, expected): 
    assert thing == expected 

Gibt es eine Möglichkeit, dies sauberer zu machen? Ich bin mir nicht sicher, ob dieser unordentliche Code besser ist als wiederholte, ähnliche Tests.

Antwort

1

Wie wäre es mit der Parametrisierung der Argumente anstelle des Ergebnisses des Methodenaufrufs?

z.B.

@pytest.mark.parametrize('args,expected', [ 
    ((arg1, arg2), 100), 
    ((arg2, arg4), 200), 
]) 
def test_parameters(client, args, expected): 
    assert client.method_with_args(*args) == expected 
Verwandte Themen