Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中生成py.test测试_Python_Unit Testing_Pytest - Fatal编程技术网

在Python中生成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)

先提问,如果你感兴趣的话再解释

在py.test的上下文中,如何从一组小的测试函数模板生成一组大的测试函数

比如:

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