如何参数化我的夹具并获取测试数据以参数化我的测试

时间:2020-07-18 10:23:09

标签: pytest

我是pytest的入门者。刚刚了解了灯具并尝试执行以下操作:

我的测试调用我编写的函数,并从代码练习网站获取测试数据。 每个测试均来自特定页面,并具有几组测试数据。 因此,我想使用@ pytest.mark.parametrize参数化我的单个测试功能。 另外,由于测试的操作是相同的,因此我想进行pageObject实例化和从页面中获取测试数据作为固定装置的步骤。

# content of conftest.py

@pytest.fixture
def get_testdata_from_problem_page():
    def _get_testdata_from_problem_page(problem_name):
        page = problem_page.ProblemPage(problem_name)
        return page.get_sample_data()
    return _get_testdata_from_problem_page

# content of test_problem_a.py
import pytest
from page_objects import problem_page
from problem_func import problem_a

@pytest.mark.parametrize('input,expected', test_data)
def test_problem_a(get_testdata_from_problem_page):
    input, expected = get_testdata_from_problem_page("problem_a")
    assert problem_a.problem_a(input) == expected

然后我意识到,如上所述,我无法使用pytest.mark来参数化测试,因为test_data应该在测试函数之外给出....

有解决方案吗?非常感谢~~

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则希望每页编写一个参数化测试。在这种情况下,您只需要编写一个函数而不是一个夹具,然后将其用于参数化即可:

import pytest
from page_objects import problem_page
from problem_func import problem_a

def get_testdata_from_problem_page(problem_name):
    page = problem_page.ProblemPage(problem_name)
    # returns a list of (input, expected) tuples
    return page.get_sample_data()

@pytest.mark.parametrize('input,expected', 
    get_testdata_from_problem_page("problem_a")) 
def test_problem_a(input, expected):
    assert problem_a.problem_a(input) == expected

正如您所写,固定装置只能用作测试功能或其他固定装置的参数,而不能在装饰器中使用。

如果要使用该功能在其他地方获取测试数据,只需将其移至通用模块并导入即可。这可以只是一些自定义实用程序模块,也可以将其放入contest.py,尽管您仍然必须导入它。

还请注意,您编写的固定装置没有任何作用-它定义了未调用并返回的局部函数。