2017-02-14 41 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使用Pytest夾具,timeline,其本身所具有的屬性instances。在測試中迭代此屬性,以便只有在timeline.instances中的每個instance的斷言成立時才通過測試。

但是,我真正想要做的是產生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