【问题标题】:Implement parameterized using json file to create multiple test iterations使用 json 文件实现参数化以创建多个测试迭代
【发布时间】:2019-09-18 06:56:41
【问题描述】:

对于文件 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"
  }
]

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

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

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

【问题讨论】:

    标签: python json pytest parameterized


    【解决方案1】:

    @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 文件中的数据将被实时提取,并且可能会不时变化

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

    【讨论】:

    • 我们可以在这个实现中使用下面的代码来读取json文件吗? def load_test_cases(): with open('test_data.json', 'r') as test_data: return json.load(test_data)
    • 我们当然可以 - 本地文件,网络文件,任何你喜欢的东西
    • 您需要确保的一件事是该方法返回的数据格式与@pytest.mark.parametrize 的第一个参数匹配(请注意,我使用的格式与您问题中的文件不同)。不过,您可以轻松转换加载的数据。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多