2017-02-14 6 views
3

は以下のPytestを考えてみパラメータ化する方法:Pytest器具

import pytest 

class TimeLine(object): 
    instances = [0, 1, 2] 

@pytest.fixture 
def timeline(): 
    return TimeLine() 

def test_timeline(timeline): 
    for instance in timeline.instances: 
     assert instance % 2 == 0 

if __name__ == "__main__": 
    pytest.main([__file__]) 

テストtest_timeline自体が属性instancesを持ってPytest器具、timelineを、使用しています。この属性はテストで反復されるため、instanceのアサーションがすべてtimeline.instancesにある場合にのみテストに合格します。

私が実際にやってみたいのは、3つのテストを生成することです。そのうち2つは合格、1つは失敗します。私は

@pytest.mark.parametrize("instance", timeline.instances) 
def test_timeline(timeline): 
    assert instance % 2 == 0 

を試みたが、私はそれを理解するように、これは、

AttributeError: 'function' object has no attribute 'instances' 

につながるPytest器具に関数が戻り値「になる」、これは一度、まだ起こっていないようですテストがパラメータ化されます。希望の方法でテストを設定するにはどうすればよいですか?

答えて

4

これは実際にindirect parametrizationによって可能です。

この例では、pytest 3.1.2で欲しいものを行います。

import pytest 

class TimeLine: 
    def __init__(self, instances): 
     self.instances = instances 

@pytest.fixture 
def timeline(request): 
    return TimeLine(request.param) 

@pytest.mark.parametrize(
    'timeline', 
    ([1, 2, 3], [2, 4, 6], [6, 8, 10]), 
    indirect=True 
) 
def test_timeline(timeline): 
    for instance in timeline.instances: 
     assert instance % 2 == 0 

if __name__ == "__main__": 
    pytest.main([__file__]) 

this similar questionを参照してください。

関連する問題