如何将参数传递给Pytest中的fixture函数?

7 浏览
0 Comments

如何将参数传递给Pytest中的fixture函数?

我正在使用py.test来测试一些封装在Python类MyTester中的DLL代码。

为了验证目的,在测试过程中我需要记录一些测试数据,并在之后进行更多的处理。由于我有很多test_...文件,我想要在大多数测试中重用测试对象的创建(即MyTester的实例)。

由于测试对象是具有对DLL变量和函数的引用,我需要为每个测试文件(要记录的变量对于test_...文件是相同的)向测试对象传递DLL变量的列表。

列表的内容用于记录指定的数据。

我的想法是这样做:

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"
# 位于conftest.py中(因为其他测试将重用它)
@pytest.fixture()
def tester(request):
    """ create tester object """
    # 如何使用下面的列表作为arg?
    _tester = MyTester()
    return _tester
# 位于test_...py中
# @pytest.mark.usefixtures("tester") 
class TestIt():
    # def __init__(self):
    #     self.args_for_tester = ["var1", "var2"]
    #     # 如何将这个列表传递给tester fixture?
    def test_tc1(self, tester):
       tester.dothis()
       assert 0 # 仅用于演示目的
    def test_tc2(self, tester):
       tester.dothat()
       assert 0 # 仅用于演示目的

是否可以像这样实现,或者是否有更优雅的方法?

通常,我可以为每个测试方法做一些设置函数(xUnit风格)。但是我想要实现一些重用。有人知道是否可以通过fixture实现这一点吗?

我知道我可以做类似于以下的事情:(来自文档)

@pytest.fixture(scope="module", params=["merlinux.eu", "mail.python.org"])

但我需要在测试模块中直接进行参数化。

是否可以从测试模块访问fixture的params属性?

0