gpt4 book ai didi

python - 如何在 python 中使用 pytest 使用 json 数组测试数据参数化测试?

转载 作者:行者123 更新时间:2023-12-01 07:21:03 24 4
gpt4 key购买 nike

我有一些测试用例和测试数据,其中测试数据采用 JSON 数组形式,如下所示:

{
"valid_data": [
{
"id": "1234",
"name": "John"
},
{
"id": "2234",
"name": "Mary"
},
{
"id": "3234",
"name": "Kenny"
},
],
"invalid_data": [
{
"id": "1234",
"name": "Mary"
},
{
"id": "2234",
"name": "Kenny"
},
{
"id": "3234",
"name": "John"
},
]
}

我现在正在测试一个 API,它将接受 JSON 作为输入,并以状态代码进行响应。如果 id 和名称在数据库中匹配,它将响应 200 OK。否则会出现 400 Bad Request。

这是我当前的测试用例:

def get_test_data(filename):
folder_path = os.path.abspath(Path(os.path.dirname(__file__)))
folder = os.path.join(folder_path, 'TestData')
jsonfile = os.path.join(folder, filename)
with open(jsonfile) as file:
data = json.load(file)
return data

def test_valid_ok(database_api):
data = get_test_data('test_data.json')

response = database_api.get_user_info(data)
assert requests.codes['ok'] == response.status_code

在我的 conftest 中,我刚刚声明了方法 database_api 并将 URL 作为参数,然后它将向 api 发送一个 post 请求。对于这部分没有问题,我已经测试过,工作正常。

但是,根据当前的结构和代码,我只能在 json 文件中包含 1 个 json 数据。我想要一个数据驱动的测试,它能够根据 json 文件中的测试数据运行多次。

我检查了 pytest 官方文档和各种在线资源,建议使用 pytest 参数化函数,但我无法使用 json 文件得到正确的结果。

如果有人能提供帮助,谢谢!

最佳答案

您可以使用pytest_generate_tests 用于使用动态数据进行参数化的钩子(Hook)。

首先创建一个fixture,测试函数可以调用该fixture来获取测试数据。

# in conftest.py
@pytest.fixture()
def test_data(request):
return request.param

现在您可以对其进行参数化,以便为每个测试数据集调用它:

#in conftest.py
def pytest_generate_tests(metafunc):
testdata = get_test_data('test_data.json')
metafunc.parametrize('test_data', testdata, indirect=True)

传递给 parametrize 函数的 testdata 必须是一个列表。所以在传递之前需要对输入数据进行一些修改。我稍微修改了 get_test_data 函数。

#in conftest.py
def get_test_data(filename):
folder_path = os.path.abspath(os.path.dirname(__file__))
folder = os.path.join(folder_path, 'TestData')
jsonfile = os.path.join(folder, filename)
with open(jsonfile) as file:
data = json.load(file)

valid_data = [(item, 1) for item in data['valid_data']]
invalid_data = [(item, 0) for item in data['invalid_data']]

# data below is a list of tuples, with first element in the tuple being the
# arguments for the API call and second element specifies if this is a test
# from valid_data set or invalid_data. This can be used for putting in the
# appropriate assert statements for the API response.
data = valid_data + invalid_data

return data

现在您的测试函数可能如下所示:

#in test_API.py
def test_(test_data):
response = database_api.get_user_info(test_data[0])

# Add appropriate asserts.
# test_data[1] == 1 means 200 response should have been received
# test_data[1] == 0 means 400 response should have been received

关于python - 如何在 python 中使用 pytest 使用 json 数组测试数据参数化测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702637/

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