ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 将参数传递给fixture函数

2019-09-23 08:07:06  阅读:546  来源: 互联网

标签:fixtures python pytest


我正在使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有