【问题标题】:Using pytest on ranges of many parameters在许多参数的范围内使用 pytest
【发布时间】:2017-11-10 15:13:06
【问题描述】:

假设我有一个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))

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

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

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 在特定参数的 some 值处失败,而不知道 哪个具体失败了。

所以我认为我正在寻找类似pytest.mark.parameterize 的嵌套版本,我可以在其中对每个参数的每个范围值运行test_runModel_range_params

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

【问题讨论】:

    标签: python nested pytest parameterized-tests


    【解决方案1】:

    我认为您正在寻找的是堆叠参数化。来自docs

    要获得多个参数化参数的所有组合,您可以堆叠参数化装饰器:

    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
    

    【讨论】:

    • 我认为您错过了问题中的粗体句子:“我不想运行所有这些参数的所有组合
    • 我不确定有什么区别。我不是问这个问题的人。
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多