首页 > 解决方案 > 我如何确保 pytest 夹具功能只执行一次,而不管同一模块中有多少次调用

问题描述

首先我有一个原始代码类

#mycode.py

class MyClass:
   def __init__(self,value):
       self.value = value
   
   def run(self):
       return self.value

   def set(self,value):
       self.value=value

我正在尝试测试此代码的用例,我正在使用“pytest_generate_tests”进行输入

#test_mycode.py

def pytest_generate_tests():
    # manipulation to point variable 'data_file'to input.json 
    parameter_name ="input"
    if parameter_name in metafunc.funcargnames:
        with open(tests_file) as data_file:
            data = json.load(data_file)
            metafunc.parametrize(parameter_name, data["test_cases"], scope="module")

我在同一个文件中的夹具如下:

#test_mycode.py
@pytest.fixture(scope="module")
def dummy_object(input): #from input file, instantiating
    return MyClass(input["data"])

def test_set(dummy_object,input):
    dummy_object.set(input["value"])   # input.json is '{ "test_cases":[{"data":5},{"value":6}]}'
    assert dummy_object.value==input["value"]

def test_run(dummy_object):
    assert dummy_object.run()==6

但它返回 5 而不是 6 ,这意味着创建另一个 MyClass 实例。有人请告诉我如何确保实例化一个对象。由于我提到的范围是“模块”,我认为只会创建一个,但事实并非如此

标签: pythonpython-3.xpytest

解决方案


为了实现它,我们可以使用@pytest.fixture 中的'params' 属性并调用函数从input.json 加载输入

def initiate_object():
#use os module to point 'dir_name' to 'input.json'
with open(dir_name) as test_data
    my_data = json.load(test_data)
    return my_data['test_cases'] #usually list for multiple inputs

@pytest.fixture(scope="module",params=initiate_object())
def dummy_object(request):  #it must take request param
return MyClass(request.param['data'])

它确保单个实例化


推荐阅读