对许多参数的范围使用pytest

2024-05-20 00:04:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个Simulation对象,其核心属性是参数字典,其形式如下:

@pytest.fixture
def param_base():
    '''Dict of parameter defaults'''

    return {
    "fs" : 2e4,                 
    "sweep_length" : 1,         
    "num_trials" : 300,         
    ...
    "pool_tau" : 1.00,          
    "quantal_size" : -10,       
    "a_tau" : (0.001,0.005)
    }

我想编写一个pytest函数,它简单地运行这个模拟,其中每个参数都有一个值范围。一个结构稍有不同的字典可以概括这一思想:

^{pr2}$

重要的是,我不想运行所有这些参数的所有组合,因为模拟的数量增长得太快了。I一次只想改变一个参数,而其他参数保持默认值。在

我目前的解决方案如下(在上述代码之后继续):

parameter_names = [
"cav_p_open",
"num_trials",
"num_stim",
"num_cav",
"cav_i",
"num_cav_ratio",
"vesicle_prox",
]

@pytest.mark.parametrize("p_name", parameter_names)
def test_runModel_range_params(p_name,param_ranges,param_base):

    alt_params = copy.deepcopy(param_base)
    p_range = param_ranges[p_name]

    for i in range(len(p_range)):
        alt_params[p_name] = p_range[i]
        SIM = utils.Simulation(params = alt_params)

这很好用,但是因为我在每个参数范围内循环,所以我只能看到代码是否失败是因为utils.Simulation在某个特定参数的某个值处失败,而不知道它具体在哪个参数上失败。在

所以我想我要找的是一个类似于pytest.mark.parameterize的嵌套版本,在这里我可以对每个参数的每个范围值运行test_runModel_range_params。在

有什么想法吗?优雅额外加分!在


Tags: namebase参数字典parameterparampytestdef
1条回答
网友
1楼 · 发布于 2024-05-20 00:04:37

我想你要找的是叠加参数化。从docs

To get all combinations of multiple parametrized arguments you can stack parametrize decorators:

import pytest
@pytest.mark.parametrize("control_var1, control_var2", [(0, 1), ('b','a')])
@pytest.mark.parametrize("default_var1, default_var2", [(2, 3), ('b','a')])
def test_foo(control_var1, control_var2, default_var1, default_var2):
    pass

相关问题 更多 >