2017-02-14 9 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. Этот атрибут повторяется в тесте, так что тест проходит только в том случае, если утверждение выполняется для каждого 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 Также см.