更新:
由于这是该问题的可接受答案,并且有时仍然会被拒绝,因此我应该添加一个更新。尽管我的原始答案(如下)是在较旧版本的pytest中执行此 *** 作的唯一方法,因为其他人已经指出pytest现在支持对灯具进行间接参数化。例如,您可以执行以下 *** 作(通过@imiric):
# test_parameterized_fixture.pyimport pytestclass MyTester: def __init__(self, x): self.x = x def dothis(self): assert [email protected] tester(request): """Create tester object""" return MyTester(request.param)class TestIt: @pytest.mark.parametrize('tester', [True, False], indirect=['tester']) def test_tc1(self, tester): tester.dothis() assert 1$ pytest -v test_parameterized_fixture.py================================================================================= test session starts =================================================================================platform cygwin -- Python 3.6.8, pytest-5.3.1, py-1.8.0, pluggy-0.13.1 -- /usr/bin/python3cachedir: .pytest_cacherootdir: .collected 2 itemstest_parameterized_fixture.py::TestIt::test_tc1[True] PASSED [ 50%]test_parameterized_fixture.py::TestIt::test_tc1[False] FAILED
但是,尽管这种形式的间接参数化是明确的,但正如@Yukihiko
Shinoda指出的那样,它现在支持一种形式的隐式间接参数化(尽管我在官方文档中找不到对此的任何明显引用):
# test_parameterized_fixture2.pyimport pytestclass MyTester: def __init__(self, x): self.x = x def dothis(self): assert [email protected] tester(tester_arg): """Create tester object""" return MyTester(tester_arg)class TestIt: @pytest.mark.parametrize('tester_arg', [True, False]) def test_tc1(self, tester): tester.dothis() assert 1$ pytest -v test_parameterized_fixture2.py================================================================================= test session starts =================================================================================platform cygwin -- Python 3.6.8, pytest-5.3.1, py-1.8.0, pluggy-0.13.1 -- /usr/bin/python3cachedir: .pytest_cacherootdir: .collected 2 itemstest_parameterized_fixture2.py::TestIt::test_tc1[True] PASSED [ 50%]test_parameterized_fixture2.py::TestIt::test_tc1[False] FAILED
我不确切知道这种形式的语义是什么,但是似乎可以
pytest.mark.parametrize识别出,尽管该
test_tc1方法不接受名为的参数,但它使用
tester_arg的
tester夹具却可以,因此它通过
tester夹具传递参数化的参数。
我有一个类似的问题-我有一个称为的夹具
test_package,后来我希望能够在特定测试中运行该夹具时将可选参数传递给该夹具。例如:
@pytest.fixture()def test_package(request, version='1.0'): ... request.addfinalizer(fin) ... return package
(对于这些目的,夹具是做什么的或返回的对象的类型无关紧要
package)。
然后希望以某种方式在测试功能中使用此固定装置,这样我也可以指定该
version固定装置的参数以用于该测试。尽管这可能是一个不错的功能,但目前尚不可能。
同时,很容易使我的夹具简单地返回一个 函数 ,该 函数 完成夹具先前所做的所有工作,但允许我指定
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的答案所暗示的那样,
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在创建其属性后可以对其进行更新,以调整各个测试的行为。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)