API测试示例

备注

本文API测试 特指HTTP API 测试

场景分析

HTTP是一个无状态协议,其通讯过程可简要描述为:发送请求、回复响应,所以,API测试步有不同的类型需要处理:

  • 构造请求

  • 断言响应

备注

在复杂的项目场景下,可能包含更多的步骤类型,例如接口mock、变量提取、延迟请求等

其中请求在前、响应在后,这就需要钩子在处理步骤时注意顺序。

此外,一个用例中可能需要多次调用不同的接口,而后仅进行一次断言,这就需要钩子在处理步骤时放松约束。

安装依赖

pytest自身无法发送HTTP请求,也无法断言响应,需要安装第三方依赖

pip install requests responses-validator

其中:

  • requests :用来发送HTTP请求

  • responses-validator :用来断言HTTP响应

如果还需要其他步骤类型,安装对应的依赖即可。

设计用例

根据分析结论和依赖的具体用法,设计xlsx版API测试用例如下:

test_api.xlsx

说明

关键字

url

header

data

status_code

text

用例名称

name

接口测试

成功

get

https://www.baidu.com

200

baidu

失败

post

https://www.baidu.com

200

baidu

备注

xlsx中的 baidu 实则为 *baidu* (含星号),因为文档格式原因未能原样显示

在这个用例中,进行了两次HTTP请求,并对结果进行断言, 其中一次成功,第二次失败,使用例整体的结果为:测试失败

实现钩子

# conftest.py

import requests
from responses_validator import validator

from pytest_xlsx import XlsxItem


def pytest_xlsx_run_step(item: XlsxItem):
    step = item.current_step
    action = step.get("关键字")

    match action:
        case 'get':
            resp = requests.get(url=step['url'], headers=step['header'],data=step['data'])
        case 'post':
            resp = requests.post(url=step['url'], headers=step['header'], data=step['data'])
        case _:
            raise ValueError('无法识别的步骤类型')

    print(f'请求成功!{action} {step["url"]}')

    validator(resp, status_code=step['status_code'], text=step['text'])
    print('断言成功!')

    return True

执行结果如下:

(.venv) C:\demo\pytest-xlsx-demo>pytest
============================= test session starts ==============================
platform win32 -- Python 3.12.0, pytest-8.3.4, pluggy-1.5.0
rootdir: C:\demo\pytest-xlsx-demo
configfile: pytest.ini
plugins: xlsx-2.0.0
collected 1 item

tests\example\test_api.xlsx F                                             [100%]

=================================== FAILURES ===================================
_________________________________ Sheet1.接口测试 __________________________________
xlsx content:
|     | 说明   | 关键字   | url                   | header   | data   |   status_code | text    |
|-----|--------|----------|-----------------------|----------|--------|---------------|---------|
|     | 成功   | get      | https://www.baidu.com |          |        | 200           | *baidu* |
| >>> | 失败   | post     | https://www.baidu.com |          |        | 200           | *baidu* |
src\\responses_validator\\__init__.py:49: ResponseAssertionError
{'status_code': "status_code is 302 and does not match the pattern '200'."}
----------------------------- Captured stdout call -----------------------------
请求成功!get https://www.baidu.com
断言成功!
请求成功!post https://www.baidu.com
=========================== short test summary info ============================
FAILED tests/example/test_api.xlsx::Sheet1::接口测试
============================== 1 failed in 0.26s ===============================

从结果来看,请求接口和第一次断言都成功了,第二次断言失败了。

具体原因是: status_code is 302 and does not match the pattern '200' (状态码是302,和预期结果200不匹配)

小结

和此前的数学运算相比,接口测试更加添加真实的业务需求。

在真实的业务需求中,往往需要对口的第三方库进行配合,还需要熟悉业务特征,了解业务步骤。 这些最终都会反应在xlsx用例文件和hook钩子函数中。

pytest-xlsx 并不会代替你理解业务特征,也不会贸然提供一个解决方案, 而是帮助你将自己的想法和理解进行落地。