gpt4 book ai didi

python - 在 pytest 的不同测试中仅使用某些 fixture 参数化

转载 作者:太空狗 更新时间:2023-10-29 21:59:41 25 4
gpt4 key购买 nike

我有一个名为 n_groups 的 fixture ,我想在某些情况下对其进行参数化,但在其他情况下则不会。这样做的原因是因为我的类似 MVC 的数据模型的结构方式,我在“模型”类中尽可能多地测试,但“ Controller ”类不需要那么广泛的测试,因为我已经在“模型”中完成。因此,在 Controller 中运行具有所有参数化的测试是多余的,我想限制测试的数量,从而限制测试时间。目前为了测试我的 Controller 的初始化,生成了超过 18,000 个测试,运行需要 42 分钟!查看Travis-CI output .

目前,我的解决方法是,

# Contents of conftest.py
import pytest
import pandas as pd
import numpy as np

@pytest.fixture(scope='module', params=[2, 3],
ids=['2_groups', '3_groups'])
def n_groups(request):
"""Number of phenotype groups.

For testing that functions work when there's only 2 groups
"""
return request.param

@pytest.fixture(scope='module')
def n_groups_fixed():
"""Fixed number of phenotype groups (3)"""
return 3

然后,我将 n_groupsn_groups_fixed 传递给创建测试数据的下一个 fixture 链。 outlierspooledsamplesn_samplesmetadata_phenotype_col fixture 也被参数化,但超出了这个问题的范围。

# Contents of conftest.py
@pytest.fixture(scope='module')
def groups(n_groups):
"""Phenotype group names"""
return ['group{}'.format(i + 1) for i in np.arange(n_groups)]

@pytest.fixture(scope='module')
def groups_fixed(n_groups_fixed):
"""Phenotype group names"""
return ['group{}'.format(i + 1) for i in np.arange(n_groups_fixed)]

@pytest.fixture(scope='module')
def groupby(groups, samples):
return dict((sample, np.random.choice(groups)) for sample in samples)

@pytest.fixture(scope='module')
def groupby_fixed(groups_fixed, samples):
return dict((sample, np.random.choice(groups_fixed)) for sample in samples)

@pytest.fixture(scope='module')
def metadata_data(groupby, outliers, pooled, samples,
n_samples,
metadata_phenotype_col):
df = pd.DataFrame(index=samples)
if outliers is not None:
df['outlier'] = df.index.isin(outliers)
if pooled is not None:
df['pooled'] = df.index.isin(pooled)
df[metadata_phenotype_col] = groupby
df['subset1'] = np.random.choice([True, False], size=n_samples)
return df

@pytest.fixture(scope='module')
def metadata_data_groups_fixed(groupby_fixed, outliers, pooled, samples,
n_samples,
metadata_phenotype_col):
df = pd.DataFrame(index=samples)
if outliers is not None:
df['outlier'] = df.index.isin(outliers)
if pooled is not None:
df['pooled'] = df.index.isin(pooled)
df[metadata_phenotype_col] = groupby_fixed
df['subset1'] = np.random.choice([True, False], size=n_samples)
return df

为每个固定装置设置一个 *_fixed 版本似乎相当麻烦。

测试的例子是数据模型中的广泛测试,测试 n_groups 的两个参数化,以及 Controller 中不太广泛的测试,它只使用 groups_fixed 测试一个“参数化” (这些不是真正的测试,只是演示的例子):

# Contents of test_model.py
class TestModel(object):
def test__init(metadata_data, ...):
...

def test_plot(metadata_data_fixed, ...);
...

# Contents of test_controller.py
class TestController(object):
def test__init(metadata_data_fixed, ...):
...

还有其他方法吗?我读过 pytest 的 parameterize文档,但它似乎只在全局设置参数化,而不是在每个测试的基础上。

我想做这样的事情:

# Contents of test_model.py
class TestModel(object):
def test__init(metadata_data, ...):
...

@pytest.mark.parameterize(n_groups=3)
def test_plot(metadata_data, ...);
...

# Contents of test_controller.py
class TestController(object):
@pytest.mark.parameterize(n_groups=3)
def test__init(metadata_data_fixed, ...):
...

更新:在 TestController 中添加 n_groups fixture 没有帮助,即这不起作用:

# Contents of test_controller.py
class TestController(object):
@pytest.fixture
def n_groups():
return 3

def test__init(metadata_data_fixed, ...):
...

我不确定为什么,因为看起来这个 fixture 应该覆盖 conftest.py

中定义的全局 n_groups

最佳答案

我不确定您是否可以使用内置的 parametrize 来做到这一点,我认为您必须根据有关被测试方法的一些信息来实现自定义参数化方案(例如,如果类在其名称中包含 Controller,您将以不同的方式对其进行参数化),使用 pytest_generate_tests hook .可以找到一些示例 here .

关于python - 在 pytest 的不同测试中仅使用某些 fixture 参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27735413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com