在Python中生成py.test测试
先提问,如果你感兴趣的话再解释 在py.test的上下文中,如何从一组小的测试函数模板生成一组大的测试函数 比如:在Python中生成py.test测试,python,unit-testing,pytest,Python,Unit Testing,Pytest,先提问,如果你感兴趣的话再解释 在py.test的上下文中,如何从一组小的测试函数模板生成一组大的测试函数 比如: models=[model1、model2、model3] 数据集=[data1,data2,data3] def生成测试学习参数功能(模型、数据): 定义此测试(模型、数据): 参数=模型。学习参数(数据) 断言((param-model.param)
models=[model1、model2、model3]
数据集=[data1,data2,data3]
def生成测试学习参数功能(模型、数据):
定义此测试(模型、数据):
参数=模型。学习参数(数据)
断言((param-model.param)<0.1)
返回此测试
对于模型,zip中的数据(模型、数据集):
#py.test如何查看此函数的结果?
生成测试学习参数函数(模型、数据)
说明:
我正在编写的代码采用模型结构和一些数据,并学习模型的参数。因此,我的单元测试包括一组模型结构和预生成的数据集,然后是一组大约5个机器学习任务,要在每个结构+数据上完成
因此,如果我手工编写此代码,我需要对每个任务的每个模型进行一次测试。每次我提出一个新模型时,我都需要复制并粘贴这5个任务,改变我所指的pickle结构+数据。这对我来说是个糟糕的练习。理想情况下,我想要的是5个模板函数,它们定义了我的5个任务中的每一个,然后为我指定的结构列表吐出测试函数
谷歌搜索让我想到了a)工厂或b)关闭,这两种情况都让我头脑发昏,并向我建议必须有一种更简单的方法,因为这个问题必须由合适的程序员定期面对。有吗
编辑:下面是解决这个问题的方法
def pytest\u generate\u测试(metafunc):
如果metafunc.funcargnames中的“模型”:
模型=[model1、model2、model3]
对于模型中的模型:
metafunc.addcall(funcargs=dict(model=model))
def测试(型号):
断言模型==“很棒”
这将对我的模型列表中的每个模型应用测试!谢谢@dfichter
(注意:顺便说一句,断言总是通过的)良好的本能py.test
通过它的pytest\u generate\u tests()
hook完全支持您所说的内容。他们会解释的。你也可以使用。hooks是为Py.test构建插件的API,而参数化fixture是一种通用的方法,可以生成输出多个值的fixture,并为它们生成额外的测试用例
插件是指一些项目范围(或包范围)的特性,而不是特定于测试用例的特性,参数化的夹具正是为测试用例参数化某些资源所需要的
因此,您的解决方案可以改写为:
@pytest.fixture(params=[model1, model2, model3])
def model(request):
return request.param
def test_awesome(model):
assert model == "awesome"
通常,像这样动态生成测试代码是个坏主意。因为你必须为测试代码编写测试等等。复制并粘贴5个任务,我认为这表明,与其生成新代码或复制粘贴,你可以发现你的函数可以测试的共性,而不知道它们正在测试什么。目前我正在编写类似def test_learn:for models in models:assert(error