后期绑定与Pytest模块冲突



我正在尝试在函数上迭代pytest,这是延迟绑定的问题使得CCD_ 2仅将测试应用于最后一个函数
对于一个简化的示例,我编写了以下test.py文件:

import pytest

def func_1(x):
return (x+10)

def func_2(y):
return (y-10)

func_1_test_cases = {'func_1': (10, 20)}
func_2_test_cases = {'func_2': (10, 0)}
# Iterating over the functions 
for func in ['func_1', 'func_2']:
@pytest.mark.parametrize('param, expected',
globals()[func + '_test_cases'].values(),
ids=list(globals()[func +
'_test_cases'].keys()))
def test(param, expected):
eval(func+'(param) == expected')

我阅读了更多关于后期绑定问题的内容,并应用了以下建议:

def test(param, expected, func=func):
eval(func+'(param) == expected')

使用命令时:pytest test.py -v
pytest报告只收集列表中的最后一个函数(func_2(:

插件:timeout-1.4.2,anyio-2.2.0,pudb-0.7.0已收集1项

1.py::test[func_2]PASSED[100%]

================================================在0.01秒内传递了1================================

func_1从未被收集
使用pytest时,后期绑定问题似乎是个骗子。我希望pytest报告收集两个函数并返回它们的状态。我真的需要解决这个问题。

这并不能直接回答您关于定义具有相同名称的多个测试的问题,但对于您发布的特定示例,将函数本身作为测试参数之一包含会容易得多:

import pytest
def func_1(x):
return (x+10)
def func_2(y):
return (y-10)
@pytest.mark.parametrize(
'func,param,expected', [
pytest.param(func_1, 10, 20, id='func_1'),
pytest.param(func_2, 10, 0, id='func_2'),
],
)
def test(func, param, expected):
assert func(param) == expected

请注意:您的测试函数没有assert,因此无论eval(func+'(param) == expected')是真是假,它都会通过。

受Kale答案的启发,我认为没有什么好的方法可以在pytestparametize装饰器上循环(如果我错了,希望有人纠正我(
唯一实用的解决方案是将函数id包含在参数列表中
这是一个经过修改的代码,接近我想要的。

import pytest

def func_1(x):
return (x+10)

def func_2(y):
return (y-10)
func_test_cases = {'func_1': (10, 20, 'func_1'), 'func_2': (10, 3, 'func_2')}

@pytest.mark.parametrize('param, expected, func',
func_test_cases.values(),    ids=func_test_cases.keys())
def test(param, expected, func):
assert eval(func+'(param) == expected')

最新更新