Python 对多个参数的范围使用pytest
假设我有一个Python 对多个参数的范围使用pytest,python,nested,pytest,parameterized-tests,Python,Nested,Pytest,Parameterized Tests,假设我有一个Simulation对象,其核心属性是一个参数字典,其形式如下: @pytest.fixture def param_base(): '''Dict of parameter defaults''' return { "fs" : 2e4, "sweep_length" : 1, "num_trials" : 300, ... "pool_tau" : 1.
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函数,它可以简单地使用这些参数的一系列值来运行这个模拟。结构稍有不同的词典可以概括这一思想:
@pytest.fixture
def param_ranges():
'''Dict of parameter ranges'''
p_name = [
"cav_p_open",
"num_trials",
"num_stim",
"num_cav",
"cav_i",
"num_cav_ratio",
"vesicle_prox",
]
p_sets = [
[0,0.01,0.99,1], #cav_p_open
[1,10,300], #num_trials
[1,2,5], #num_stim
[1,3,10], #num_cav
[0,1,5,10], #cav_i
[1,2], #num_cav_ratio
[0,0.01,0.25,1], #vesicle_prox
]
return dict(zip(p_name,p_sets))
重要的是,我不想运行所有这些参数的所有组合,因为模拟的数量增长太快了。我一次只想改变一个参数,而其他参数保持默认值
我当前的解决方案如下(在上述代码之后继续):
这很好,但是因为我在循环每个参数范围,我只能看到代码是否失败,因为utils.Simulation
在某个特定参数的值上失败,而不知道它在哪个值上失败
所以我想我要找的是类似于pytest.mark.parameterize
的嵌套版本,在这里我可以对每个参数的每个范围值运行test\u runModel\u range\u params
有什么想法吗?额外的优雅点 我认为您需要的是堆叠参数化。从: 要获取多个参数化参数的所有组合,可以堆叠参数化装饰器:
我想你错过了问题中粗体的一句:“我不想运行所有这些参数的所有组合”,我不确定区别是什么。我不是那个问这个问题的人。
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)
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