接口测试 已退 (失) 休 (业),公开个人写的 HTTP 接口自动化方案 (pytest+requests+allure+jsonschema),非常适合小白

大桥 · April 26, 2024 · Last by disable replied at April 30, 2024 · 6101 hits

写在前面

本人 40+ ,在帝都干了差不多 20 年的软件测试相关工作,基本上都算大厂或二线大厂吧,主要涉及反病毒主动防御等安全类客户端,Android 客户端,SaaS 系统等,去年起开始赋闲。前几天给一个朋友的团队做 HTTP 接口自动化分享,于是翻出了之前写的框架,略微整理下,主要是去掉了老东家用的 slack 告警,email 检查等,并完善了部分 README 内容,现在公开此方案,希望对有些朋友能有所帮助。
另外,大家使用中如果有什么问题和要求,可在此跟帖,或直接在 github 提 Issues,我抽空可能会回复哈。此外还写了个基于 playwright 的 web 自动化测试框架,过些天整理后也可能会公开分享。
API 自动化项目地址: https://github.com/wangdaqiao/Http_API_Auto

Python 3 实现 Http API 自动化 (pytest + requests + Allure)


主要思路和步骤

  1. 借助 Mitmproxy 来抓取产品使用中的 http api 接口数据
  2. 运行脚本 generate_newcases_from_api_record.py 处理上一步抓取到的接口数据,可生成新 api 的测试数据。
  3. 根据需要设置 api 的测试数据,补充到框架中。如完善 status code, 指定运行环境和优先级,提取参数变量,完善 jsonschema 校验等,通常仅需处理参数提取逻辑。
  4. 执行测试。

实现功能

  • 通过 requests session 会话,一次登录,免除 cookie 关联处理
  • 测试数据驱动,csv 方便版本比较,补充完善用例
  • 自动生成测试用例(含断言),小白也很好用
  • 支持接口间传参
  • 支持多进程,加速测试执行过程
  • 支持多用户
  • 支持多环境切换,仅需改动一处
  • 断言:除了 status code,还支持 json schema 断言
  • 漂亮的 Allure 报告,可查看每个接口的请求和响应数据,以及断言,方便排查
  • Slack 告警(老东家用的,这里已去除)
  • ......

整体结构

。。。。。。

用法

  1. 安装 Python 3.7+
  2. 下载代码。
  3. 在当前文件夹中,运行 pip install -r requirement.txt 安装依赖包
  4. 通过“allure2”安装 allure 2.1.38+
  5. 参考 “config” 子文件夹中的config_sample.yaml生成config.yaml文件,并进行配置。
  6. 如果是想体验下效果,可先进入 flask demo 目录,执行 python app.py 命令在本地启动一个 http 测试服务端,否则请忽略。
  7. 执行 python3 run_api_cases.py,完成后默认会自动打开测试报告网页。 另外,可以在第一个参数中指定运行环境,例如 python3 run_api_cases.py prod

补充:报告会有每个接口的 url,请求方法,payload,状态码,返回数据,如果失败,会注明失败原因,如状态码不符合预期,或返回的数据哪里与预期不符,不妨看看这个失败 case 的截图吧

最佳回复

技术有点老

共收到 19 条回复 时间 点赞

技术有点老

是长亭的兄弟吗

老哥能留个 V 或者 Q 吗?

大桥 #4 · April 26, 2024 Author
沫沫sir 回复

非也,非也,我没在长亭呆过

大桥 #5 · April 26, 2024 Author
Jan95 回复

嗯,这是我大约三年前写的,胜在简单易用,效率高,运行速度快,查看结果比较方便。基本上略有 python 基础的小伙伴,用不了一个小时,就能掌握可自行写新模块的接口自动化 cases 了。

大桥 #6 · April 26, 2024 Author

再补充下我为何选择用 csv 来存用例,而不是用 json,yaml 和 Excel?
这首先排除的是 Excel,不是纯文本,不方便做版本比较。yaml 和 json 方式不大方便组织用例顺序,对于有相互依赖的尤其不便。另外插入删除,批量编辑也不便,综合比较下来还是觉得 csv 最方便,一目了然。

前辈您好,这里正好有个有点小困难的事情需要大佬来看下,希望大佬可以对业界留下点东西
具体就是 ios17 性能测试的开源解决方案。自从 ios17 出来后业界免费的移动端性能测试都没有跟进支持。根本原因是 ios17 后的架构有修改。
这个问题的就题解想法和一些方案负载这个回答里了:https://github.com/smart-test-ti/SoloX/issues/260
如果大佬有时间可以考虑下解决这个问题为业界留下点东西

大桥 #8 · April 27, 2024 Author
范顿顿 回复

抱歉,没有专门搞过 ios
之前更多的时间是搞反病毒,HIPS,系统备份还原等客户端,后来搞过一年多的 Android,最近六七年是在搞 SaaS 系统。

范顿顿 回复

开源的解决方案已经有了 现在 已经可以和 iOS17 建立通信了,已经有方案了

通过 requests session 会话,一次登录,免除 cookie 关联处理
这一点不是通用的吧,我在公司环境上行不通。

自己写的 KDT 关键字驱动框架,啥都能测。没有用 pytest

微凉 回复

对 pymobiledevice3 可以,但是 pymobiledevice3 本身依赖很多需要把它整合到现有的工具中。具体的方案可以看这个里面:https://github.com/smart-test-ti/SoloX/issues/260

退休?钱看来是赚够了

大瓶子 回复

requests session 会话不是这么用的。大多服务端使用 http 协议时的鉴权机制都是通过 header 里面的特定字段去判断,像你这个例子,拿到鉴权字段后,去 session 里面更新一下:session.headers.update({"access_token":"xxx"}),后续再通过这个 session 会话的时候,就会带上这个字段了。

大桥 #15 · April 28, 2024 Author
大瓶子 回复

每家产品的登录逻辑都是不同的,没法通用。
楼上回答的已经很好,请参考,通常是根据登录接口的返回,再往 session 的 header 写入一个或两个字段。

大桥 #16 · April 28, 2024 Author
disable 回复

其实还没有,只能说生活简单,暂时还有的花

aabbcc 回复

学到了,按照你的说法,操作成功了

先收藏,在学习,就是社区好像不支持收藏内容分文件夹和搜索,收藏多了找起来麻烦

大桥 回复

羡慕了

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up