python – 将参数传递给fixture函数
作者:互联网
我正在使用py.test来测试包含在python类MyTester中的一些DLL代码.
为了验证目的,我需要在测试期间记录一些测试数据,然后再进行更多处理.由于我有很多测试_…文件,我想在大多数测试中重用测试器对象创建(MyTester实例).
由于测试对象是获得对DLL的变量和函数的引用的对象,我需要将DLL的变量列表传递给每个测试文件的测试对象(要记录的变量对于test_ .. .文件).
列表的内容应用于记录指定的数据.
我的想法是以某种方式这样做:
import pytest
class MyTester():
def __init__(self, arg = ["var0", "var1"]):
self.arg = arg
# self.use_arg_to_init_logging_part()
def dothis(self):
print "this"
def dothat(self):
print "that"
# located in conftest.py (because other test will reuse it)
@pytest.fixture()
def tester(request):
""" create tester object """
# how to use the list below for arg?
_tester = MyTester()
return _tester
# located in test_...py
# @pytest.mark.usefixtures("tester")
class TestIt():
# def __init__(self):
# self.args_for_tester = ["var1", "var2"]
# # how to pass this list to the tester fixture?
def test_tc1(self, tester):
tester.dothis()
assert 0 # for demo purpose
def test_tc2(self, tester):
tester.dothat()
assert 0 # for demo purpose
有可能像这样实现它还是有更优雅的方式?
通常我可以使用某种设置函数(xUnit-style)为每个测试方法执行此操作.但我希望获得某种重用.有没有人知道这是否可以使用灯具?
我知道我可以这样做:(来自文档)
@pytest.fixture(scope="module", params=["merlinux.eu", "mail.python.org"])
但是我需要在测试模块中直接进行参数化.
是否可以从测试模块访问夹具的params属性?
解决方法:
我遇到了类似的问题 – 我有一个名为test_package的夹具,后来我想在特定测试中运行它时能够将一个可选参数传递给该夹具.例如:
@pytest.fixture()
def test_package(request, version='1.0'):
...
request.addfinalizer(fin)
...
return package
(对于这些目的而言,夹具的功能或返回包装的对象类型无关紧要).
然后,需要以某种方式在测试函数中使用此夹具,以便我还可以指定该夹具的版本参数以与该测试一起使用.目前这是不可能的,但可能会成为一个很好的功能.
与此同时,很容易使我的fixture只返回一个函数,该函数执行fixture之前所做的所有工作,但允许我指定version参数:
@pytest.fixture()
def test_package(request):
def make_test_package(version='1.0'):
...
request.addfinalizer(fin)
...
return test_package
return make_test_package
现在我可以在我的测试函数中使用它,如:
def test_install_package(test_package):
package = test_package(version='1.1')
...
assert ...
等等.
OP尝试的解决方案朝着正确的方向前进,正如@ hpk42的answer建议的那样,MyTester .__ init__可以存储对请求的引用,如:
class MyTester(object):
def __init__(self, request, arg=["var0", "var1"]):
self.request = request
self.arg = arg
# self.use_arg_to_init_logging_part()
def dothis(self):
print "this"
def dothat(self):
print "that"
然后使用它来实现夹具,如:
@pytest.fixture()
def tester(request):
""" create tester object """
# how to use the list below for arg?
_tester = MyTester(request)
return _tester
如果需要,可以对MyTester类进行一些重构,以便在创建后可以更新其.args属性,以调整各个测试的行为.
标签:fixtures,python,pytest 来源: https://codeday.me/bug/20190923/1814660.html