之前在社区里看到的一篇关于接口自动化测试平台的文章https://testerhome.com/topics/38797 ,试用了下后就想写写关于自动化的,顺便说下为什么大多数功能测试会觉得测试平台不好用的典型原因,大佬们轻喷。
-> 个人觉得做什么事情前,应该想下做的动机和想要达成的目的,这样会减少很多不必要的弯路
线上定时巡检,监测系统稳定性,更早地发现问题,减少故障恢复的时间
辅助提高回归测试质量(就是辅助作用,别想着能靠自动化发现大问题)
记录每次巡检的结果,有助于团队了解系统的历史性能
-> 说到底接口自动化的所有处理就是围绕下面三步去提取测试点和选型工具,并没有什么很高大上的东西,底层还是看写测试点的这个人的业务水平,创建出有效的测试点。
第一步 | 第二步 | 第三步 |
---|---|---|
发出请求 | 请求处理 | 得到回包 |
我们基本根据这三步和上面的目的去规划测试点和实现方式
编程语言 | 测试框架 | 测试报告 |
---|---|---|
支持网络编程并有配套的测试框架,学习成本越小越好 | 稳定/易学 | 直观/学习成本低 |
校验项分类 | 校验方式 | 是否起到作用 |
---|---|---|
基础检查 | 状态码检查 | 当前接口是否可用,返回协议状态码是否正确 |
响应时间检查 | 验证响应时间是否在可接受的范围内 | |
请求路径检查 | 验证接口路径 | |
> | ||
数据检查 | 返回数据一致性 | 验证接口返回是否与预期数据一致,关键参数断言 |
返回数据的层级 | 验证数据层级变动,防止前端交互裂开 | |
返回数据格式 | 返回的数据是否符合预期的格式,如 json 或者 xml 等 | |
> | ||
业务逻辑检查 | 业务规则验证 | 验证接口是否正确地执行了特定的业务规则 |
返回数据格式 | 返回的数据是否符合预期的格式,如 json 或者 xml 等 | |
> | ||
其他用法 | 吞吐量检查 | 验证接口在一定并发量下的吞吐量是否符合性能要求 |
响应时间和负载测试 | 在不同的负载下验证接口的响应时间是否在可接受的范围内 |
-> 这里用 pytest 的测试框架来描述解决方法,不同的测试框架自己找对应的方法
场景 | 描述 | pytest 解决方式 |
---|---|---|
接口依赖 | 多个接口之间存在依赖关系,如:接口 A 输出可能是接口 B 的输入 | @pytest.fixture 允许你定义和共享测试用例之间的资源和设置 |
动态数据和状态管理 | 动态数据如:时间戳等,状态管理如:登录状态、用户权限状态、资源分配状态等 | @pytest.fixture 前后置允许你动态生成或设置数据,以适应接口返回的动态变化 |
错误重试 | 有时候环境问题导致执行失败,需要进行重试 | 使用 pytest-rerunfailures 插件,通过 --reruns 和 --reruns-delay 选项指定重试的次数和延迟时间 |
数据驱动测试 | 在相同测试用例上使用不同的输入数据,以增加测试覆盖率 | @pytest.mark.parametrize,实现数据驱动测试 |
并行执行 | 需要提高用例执行速度 | 使用插件 pytest-xdist 来实现并行执行测试用例 |
-> 现在的普遍论调应该基本都是在技术优化上,但是实际上自动化测试的实际痛点的本质上因为人的痛点:
如果你是用 python,大致用到的就是这些,除了通用的 http 请求,如果有其他协议,就找对应协议的库
测试框架:
pytest: 用于编写和执行测试用例,支持参数化测试、夹具等功能。
HTTP请求库:requests: 用于发送HTTP请求,方便处理接口的GET、POST等操作
数据驱动:yaml: 用于存储测试数据,例如接口请求参数、期望响应等。可以使用PyYAML库解析YAML格式的数据文件。
数据库连接:mysql-connector-python,用于与MySQL数据库建立连接,执行数据库操作,例如验证接口返回的数据与数据库中的数据是否一致。
日志记录:logbook,用于记录测试过程中的日志信息,有助于排查问题和进行调试。
报告生成:allure-pytest,结合pytest和Allure生成详细的测试报告,提供可视化的测试结果和执行历史。
了解问题的核心关键在于 “从群众中来,到群众中去”,这句话同样适用于测试岗,很多平台都会标注【独特的用例编写方式】、【低门槛,易使用】的特性,但是实际上都是粗制 web 化的 jmeter 或者粗制 web 化的 postman 又或者是奇葩的低代码拖拽,不仅创建用例麻烦不灵活 且 调试接口费时间,功能细化和封装过度也导致了不小的学习使用成本,且该学习成本不像 jmeter 这种工具的使用经验那样可复用。这些既不能提高效率又不能用来提高测试水平的做法用一句话来形容的话就是:“离群众太远了”。
测试平台交互模式:
- 1. 创建项目 ->创建模块->创建 case->关联项目->关联模块
- 2. 编写 case:请求参数、前后置、预期值等多个输入框,需要逐个点击填写信息 (和 jmeter 创建用例的方式有什么区别?),当接口发生变更时,也是需要逐个用例手动修改信息,维护成本高,用例的可读性也差
- 3.调试 case: 调试信息不够清晰且慢,调试出问题时也无法马上明确是平台问题还是接口本身问题
- 把【低门槛,易使用】理解为:不用写代码就是容易用,抛开实际意义上的实用。
- 太想通用:平台的灵活性本身比较差,为了增加灵活性又为了考虑功能测试不懂代码,通常都会将多种操作流程组件化,增加很多配置项。但是一件产品如果是一端的产出,没有对应的产品、测试和持续的用户反馈,必定会有设计不当或者过度组件化,导致测试用例的抽象层次变得复杂、上手难度增加、执行有性能问题等
- 鸡肋:为体现自身技术,选型难度较大的前后端技术栈,过度追求技术炫耀让平台更难理解和使用,底层逻辑还是走的对返回包的断言,导致难以让人信服。就像赛博丁真绕了个大圈关灯一样
- 都什么年代了,现在面试功能测试哪个不要求基本的代码脚本能力?,更别说现在都有 gpt 加持,真的不用特别考虑测试无代码能力的场景
- 都是测试,肯定是希望通过写脚本去巩固自己熟悉的开发语言,即使繁琐,也有学习成长的快感
哪怕你用下面最简单明了的模式,哪又怎样? 能达到自动化的目的即可,干嘛要折磨自己(个人见解,大佬忽略)
project_root/
|-- api_tests/ 存放 API 测试用例的目录
| |-- project1/ 项目1
| | |-- __init__.py
| | |-- test_api_project1.py
| | |-- utils/
| | |-- __init__.py
| | |-- api_client_project1.py 封装 API 请求的客户端工具
| |-- project2/ 项目2
| |-- __init__.py
| |-- test_api_project2.py
| |-- utils/
| |-- __init__.py
| |-- api_client_project2.py 封装 API 请求的客户端工具
|-- conftest.py 共享的 fixture 和配置信息
|-- pytest.ini Pytest 的配置文件
|-- requirements.txt
"To be continued。。。"
先记录着,有时间再回来改下,话说社区的 markdown 语法能不能支持下字体颜色还有换行。。。。