2012-12-18 29 views
9

Tôi có hai thiết lập thử nghiệm đơn giản và tôi đang cố gắng nhóm chúng trong một lịch thi đấu và muốn chức năng kiểm tra chuyển vào 'tham số' cho lịch thi đấu.Các thông số có thể được chuyển đến vật cố định được chuyển thành biến không?

Dưới đây là ví dụ được giải thích, để giải thích câu hỏi của tôi. Nói rằng tôi có cố pytest sau:

@pytest.fixture(scope="module", params=['param1','param2']) 
def myFixture(request): 
    if request.param == 'param1': 
     p = 5 
    elif request.param == 'param2': 
     p = 10 
    return p 

# would like to set request.param = ['param1'] for myFixture 
def test_madeup(myFixture): 
    assert myFixture == 5 

# would like to set request.param = ['param2'] for myFixture 
def test_madeup2(myFixture): 
    assert myFixture == 10 

Tôi có thể làm cho nó để các params trên được thông qua tại như một đầu vào cho test_madeup chức năng? Vì vậy, một cái gì đó như sau:

@pytest.fixture(scope="module", params=fixtureParams) 
def myFixture(request): 
    if request.param == 'param1': 
     return 5 
    elif request.param == 'param2': 
     return 10 


def test_madeup(myFixture, ['param1']): 
    assert myFixture == 5 

Ở trên, tất nhiên, không hoạt động. Trường hợp thực sự phức tạp hơn một chút, nhưng tôi chỉ muốn biết liệu tôi có thể vượt qua params=['param1','param2'] vào vật cố từ chức năng test_madeup hay không.

Trả lời

14

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, về cơ bản bạn muốn chọn một thể hiện của một vật cố parametrized để thực hiện với một bài kiểm tra, bằng cách cung cấp một số thông tin với bài kiểm tra. Nó không thể mặc dù chúng ta có thể nghĩ về một cơ chế. Tôi không chắc chắn nếu các giải pháp sau đây bản đồ cho toàn bộ vấn đề của bạn, nhưng đây là một cách để giải quyết trường hợp cụ thể nêu trên:

import pytest 

@pytest.fixture(scope="module") 
def myFixture1(): 
    return 5 

@pytest.fixture(scope="module") 
def myFixture2(): 
    return 2 

@pytest.fixture(scope="module", params=["param1", "param2"]) 
def myFixture(request): 
    if request.param == 'param1': 
     return request.getfuncargvalue("myFixture1") 
    elif request.param == 'param2': 
     return request.getfuncargvalue("myFixture2") 

def test_1(myFixture1): 
    assert myFixture1 == 5 

def test_2(myFixture2): 
    assert myFixture2 == 2 

def test_all(myFixture): 
    assert myFixture in (2,5) 

này chạy bốn thử nghiệm, bởi vì test_all được thực hiện hai lần với cả đồ đạc.

Nếu thiết lập các đồ đạc của bạn không nặng, bạn cũng có thể có một vật cố định tạo danh sách và một vật cố định "lặp". Một thử nghiệm sau đó có thể lấy toàn bộ danh sách và chỉ mục nó vào nó.

3

Không chắc nếu đây là những gì bạn muốn, nhưng trường hợp ví dụ có thể được thực hiện như:

@pytest.mark.parametrize(('param', 'expected'), [('param1', 5), ('param2', 10)]) 
def test_madeup(param, expected): 
    assert param == expected 
Các vấn đề liên quan