python - 使用 pytest,我可以在测试功能之外获取夹具值吗?
问题描述
我正在使用参数化测试来测试 2 个不同的数据集。比如像这样。some_data()
函数返回测试数据。
test_data = [
(some_data1_v1(), some_data2_v2()),
(some_data1_v2(), some_data2_v2())
]
@pytest.mark.parametrize('a,b', test_data)
def test_fn(a,b):
pass
但是对于一些只检查一般行为的测试,我不需要测试 2 个数据集,因为这两个数据集都有适当的一般数据。我想将some_data1_v1()
函数转换为夹具并在测试中使用它,就像这样
def test_fn2(some_data1_v1):
pass
如果我会这样做,那么some_data1_v1()
在test_data
列表构造期间调用引发异常Fixtures are not meant to be called directly...
所以取而代之的是
def test_fn2(some_data1_v1):
pass
我喜欢这个
@pytest.mark.parametrize('some_data1_v1', [some_data1_v1()])
def test_fn2(some_data1_v1):
pass
这让我有一个测试数据来源 - “假夹具”(返回数据的常用函数),并在test_data
列表中传递测试数据(第一个示例或最后一个示例)。但我认为我在常用函数中存储数据的方法是打破“夹具抽象”。
有没有更好的方法来做我所做的事情?
解决方案
您可以使用参数化的夹具。 request.param
指params
序列中的特定条目
例如:
@pytest.fixture(params=(1, 2, 3))
def fix1(request):
return request.param
@pytest.fixture(params=(4, 5, 6))
def fix2(request):
return request.param
def test1(fix1, fix2):
print(fix1, fix2)
def test2(fix1):
print(fix1)
和执行:
$ pytest t.py
...
collected 12 items
t.py::test1[1-4] 1 4
PASSED
t.py::test1[1-5] 1 5
PASSED
t.py::test1[1-6] 1 6
PASSED
t.py::test1[2-4] 2 4
PASSED
t.py::test1[2-5] 2 5
PASSED
t.py::test1[2-6] 2 6
PASSED
t.py::test1[3-4] 3 4
PASSED
t.py::test1[3-5] 3 5
PASSED
t.py::test1[3-6] 3 6
PASSED
t.py::test2[1] 1
PASSED
t.py::test2[2] 2
PASSED
t.py::test2[3] 3
PASSED
推荐阅读
- angular - 带有旁观者日志的角度组件测试“无法绑定到输入”警告模拟子组件
- node.js - MongoDB:期望:连接失败,退出代码 1
- html - 如何在html中制作psd图片
- node.js - 我正在使用 Oauth 进行 google 身份验证并获取 client-id 和 client_secret 但它显示未定义
- android - Fetch 函数导致 SQL Transient 服务器行为异常
- flutter - 类似 Whatsapp 的搜索图标,点击时覆盖标题但在正文中 - 使用 Flutter
- excel - 从单元格引用转换为命名范围
- c++ - 为什么 mutiset 不像 set
- scala - scala中的复合类型与mixins
- linux - Visual Studio Code 通过脚本触发热部署