python - 我如何确保 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 实例。有人请告诉我如何确保实例化一个对象。由于我提到的范围是“模块”,我认为只会创建一个,但事实并非如此
解决方案
为了实现它,我们可以使用@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'])
它确保单个实例化
推荐阅读
- email - 为我的邮件服务器设置 DNS 记录 - DMARC 和 SPF - 添加到所有域还是只添加到邮件服务器域?
- javascript - Firebase 请求 url 在网络选项卡的请求有效负载中显示用户名和密码
- macos - Docker 系统修剪会留下大量(42GB)图像数据
- azure - 从 on-permise 到 Azure 的连接速度很慢
- sql - 使用 group by 时可以避免聚合吗?
- angular-cli - 在 Angular 中安装新项目后出现奇怪的错误
- javascript - 如何将 NeDB 对象存储在集合中?
- c# - 使用 Azure Key Vault 签署 JWT 令牌
- npm - NPM 错误:npm 错误!无法确定要运行的可执行文件
- php - 在 WooCommerce 中禁用特定产品的取消订阅