使用 json 文件实现参数化以创建多个测试迭代



对于test_data.json的文件,我想用python创建测试迭代。此文件中的数据仅包含要传递给特定方法的相应值。同时,断言部分是单独处理的(这里不需要json文件数据(。

因此,为了使用静态数据创建这些,我实现了@pytest.mark.parameterized,如下所示。此实现运行良好,因为它创建了 5 个测试迭代为 1,2,3,4,5,并且执行没有任何错误:-

import pytest 
@pytest.mark.parametrize('key_value',
[
'1',
'2',
'3',
'4',
'5',
]
)
def test_method(key_value):
go_to_key(key_value)

现在,鉴于我正在使用的json文件中的数据将被实时拉入,并且可能会不时变化。因此,我需要以某种方式使用参数化来读取 json 文件,然后根据拉入的key_values构建测试迭代。

文件名 = test_data.json

test_data.json 中的 json 数据如下所示

[
{
"key": "1"
},
{
"key": "2"
},
{
"key": "3"
},
{
"key": "4"
},
{
"key": "5"
}
]

使用参数化时,我遇到了以下代码片段,但它仍然没有为测试迭代提供任何明确的实现:-

@parameterized(
param.explicit(*json.loads(line))
for line in open("testcases.jsons")
)
def test_from_json_file(...):
...

有人可以查看并分享在上述代码上下文中使用 json 文件创建测试迭代的任何实现建议吗?谢谢!

@pytest.mark.parametrize中,不同事例的值不仅可以作为列表文字出现,还可以是方法调用的结果。

因此:

@pytest.mark.parametrize('key_value', [
'1',
'2',
'3'
])
def test_is_key_digit(key_value: str):
assert key_value.isdigit()

可以轻松转换为:

def load_test_cases():
return ['1', '2', '3']

@pytest.mark.parametrize('key_value', load_test_cases())
def test_is_key_digit(key_value: str):
assert key_value.isdigit()

load_test_cases可以使用任何代码来生成所需的值。例如,从字符串中读取 Json

def load_test_cases():
return json.loads('["1", "2", "3"]')

作为旁注,您写道:

我正在使用的json文件中的数据将被实时拉入,并且可能会不时变化

这听起来是个坏主意。使测试可重现是一种很好的做法,并且使它们依赖于外部系统生成的某些文件显然与该目标背道而驰。

最新更新