python-3.x - 在参数化夹具中缓存测试数据
问题描述
我有各种使用通用数据的测试用例。我使用pytest
夹具来缓存测试数据并加快测试速度。
例如:
@pytest.fixture(scope='module')
def data():
large_data = download('XYZ')
return large_data
def test_foo(data):
pass
def test_bar(data):
pass
我想将测试扩展到两个数据集。蛮力解决方案是:
@pytest.fixture(scope='module')
def data1():
large_data = download('XYZ')
return large_data
@pytest.fixture(scope='module')
def data2():
large_data = download('ABC')
return large_data
def test_foo1(data1):
pass
def test_foo2(data2):
pass
def test_bar1(data1):
pass
def test_bar2(data2):
pass
现在的问题是这test_bar
是通用的。从某种意义上说,测试程序独立于数据。因此,复制它是一个坏主意。
所以,我决定使用如下间接参数:
@pytest.fixture(scope='module')
def data(request):
if request.param == 1:
large_data = download('XYZ')
if request.param == 2:
large_data = download('ABC')
return large_data
@pytest.mark.parametrize('data', [1], indirect=True)
def test_foo1(data):
pass
@pytest.mark.parametrize('data', [2], indirect=True)
def test_foo2(data):
pass
@pytest.mark.parametrize('data', [1, 2], indirect=True)
def test_bar(data):
pass
但现在我失去了缓存优势。下载数据以供测试。如何告诉 pytest 缓存参数化夹具的数据?
解决方案
我找到了一个(非理想的)解决方案。这个想法是为每个测试数据(不能很好地扩展)定义一个固定装置,然后使用“包装器”参数化固定装置来返回它们的值。
@pytest.fixture(scope='module')
def data1():
large_data = download('XYZ')
return large_data
@pytest.fixture(scope='module')
def data2():
large_data = download('ABC')
return large_data
@pytest.fixture(scope='module')
def data(request):
return request.getfixturevalue(request.param)
def test_foo1(data1):
pass
def test_foo2(data2):
pass
@pytest.mark.parametrize('data', ['data1', 'data2'], indirect=True)
def test_bar(data):
pass
我已经验证过(至少在这个例子中)每个数据集都被下载一次,而且只下载一次。然而,我很想知道是否有“更清洁”的解决方案。
推荐阅读
- python - 如何根据熊猫中的行值创建新列
- python - 在 Keras 中加载 Model.save 后使用不同数据进行相同预测
- java - PicoPluginExtensionInitializationException:找不到基本名称 org.jetbrains.plugins.cucumber.CucumberBundle 的捆绑包,语言环境 en_US
- javascript - Javascript:将长 CSV 字符串拆分为字符串数组而不会丢失值
- sql - 我们如何在sql查询中同时使用like和limit?
- spring-boot - 从 Spring Boot 1.5.x 升级到 2.0.x 时的 @Crossorigin 根中断
- php - 如何访问和修改外部文件中的 PHP 变量?
- php - 如何将图像从 React naitve 上传到 mysql 数据库?
- r - R矢量化重复循环
- php - 为什么使用 PHP 加载 URI 图像的速度非常慢