编程语言
首页 > 编程语言> > python – 将参数传递给fixture函数

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