我是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应该在测试函数之外给出....
有解决方案吗?非常感谢~~
答案 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
,尽管您仍然必须导入它。
还请注意,您编写的固定装置没有任何作用-它定义了未调用并返回的局部函数。