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

大桥 · 2024年04月26日 · 最后由 disable 回复于 2024年04月30日 · 9024 次阅读

写在前面

本人 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 吗?

sir 回复

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

Jan95 回复

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

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

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

范顿顿 回复

抱歉,没有专门搞过 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 · 2024年04月28日 Author
大瓶子 回复

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

大桥 #16 · 2024年04月28日 Author
disable 回复

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

aabbcc 回复

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

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

大桥 回复

羡慕了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册