测试基础 尝试说下自动化测试

测试新人 · 2024年01月17日 · 最后由 悲伤蛙 回复于 2024年01月30日 · 9594 次阅读

背景

之前在社区里看到的一篇关于接口自动化测试平台的文章https://testerhome.com/topics/38797 ,试用了下后就想写写关于自动化的,顺便说下为什么大多数功能测试会觉得测试平台不好用的典型原因,大佬们轻喷。

一、接口自动化到底要验证什么

-> 个人觉得做什么事情前,应该想下做的动机和想要达成的目的,这样会减少很多不必要的弯路

1. 自动化的原因
  • 测试界普遍认为应该加自动化用于提高测试效率和保障
  • 测试 kpi 任务
  • 应对需要频繁执行的测试场景
  • 需要增加信心和可靠性

2. 理想中的目的
  • 线上定时巡检,监测系统稳定性,更早地发现问题,减少故障恢复的时间

  • 辅助提高回归测试质量(就是辅助作用,别想着能靠自动化发现大问题)

  • 记录每次巡检的结果,有助于团队了解系统的历史性能


3. 接口自动化的设计方向

-> 说到底接口自动化的所有处理就是围绕下面三步去提取测试点和选型工具,并没有什么很高大上的东西,底层还是看写测试点的这个人的业务水平,创建出有效的测试点。

第一步 第二步 第三步
发出请求 请求处理 得到回包

我们基本根据这三步和上面的目的去规划测试点和实现方式

  • 3.1 工具选择原则
编程语言 测试框架 测试报告
支持网络编程并有配套的测试框架,学习成本越小越好 稳定/易学 直观/学习成本低

-

  • 3.2 主要测试点提取
校验项分类 校验方式 是否起到作用
基础检查 状态码检查 当前接口是否可用,返回协议状态码是否正确
响应时间检查 验证响应时间是否在可接受的范围内
请求路径检查 验证接口路径
>
数据检查 返回数据一致性 验证接口返回是否与预期数据一致,关键参数断言
返回数据的层级 验证数据层级变动,防止前端交互裂开
返回数据格式 返回的数据是否符合预期的格式,如 json 或者 xml 等
>
业务逻辑检查 业务规则验证 验证接口是否正确地执行了特定的业务规则
返回数据格式 返回的数据是否符合预期的格式,如 json 或者 xml 等
>
其他用法 吞吐量检查 验证接口在一定并发量下的吞吐量是否符合性能要求
响应时间和负载测试 在不同的负载下验证接口的响应时间是否在可接受的范围内

-

  • 3.3 测试场景实现难点(大部分都能借助测试框架解决,解决不了的就用工作流程解决,再解决不了的就不用解决,自动化测试只是辅助措施

-> 这里用 pytest 的测试框架来描述解决方法,不同的测试框架自己找对应的方法

场景 描述 pytest 解决方式
接口依赖 多个接口之间存在依赖关系,如:接口 A 输出可能是接口 B 的输入 @pytest.fixture 允许你定义和共享测试用例之间的资源和设置
动态数据和状态管理 动态数据如:时间戳等,状态管理如:登录状态、用户权限状态、资源分配状态等 @pytest.fixture 前后置允许你动态生成或设置数据,以适应接口返回的动态变化
错误重试 有时候环境问题导致执行失败,需要进行重试 使用 pytest-rerunfailures 插件,通过 --reruns 和 --reruns-delay 选项指定重试的次数和延迟时间
数据驱动测试 在相同测试用例上使用不同的输入数据,以增加测试覆盖率 @pytest.mark.parametrize,实现数据驱动测试
并行执行 需要提高用例执行速度 使用插件 pytest-xdist 来实现并行执行测试用例

4. 自动化实现中的实际痛点

-> 现在的普遍论调应该基本都是在技术优化上,但是实际上自动化测试的实际痛点的本质上因为人的痛点:

  • 1.日益增长的工作内容同有限人力之间的矛盾
    • 有限的测试人力无法满足日益增加的测试需求/要求
    • 引入自动化测试无法减少工作量的增加,却要挤出时间和资源去实施和维护一个辅助性质的自动化

-

  • 2.理想化愿景与实际可行性之间的矛盾
    • 平台化设计过度复杂,想要覆盖各种测试需求,导致用例创建繁琐、学习曲线陡峭
    • 妄想匹配所有项目需求,不断细化和组件化等,导致失去灵活性、增加维护成本

-

  • 3.技术追求与实际需求之间不平衡的矛盾
    • 倾向于追求更高级、复杂的技术,以展示其专业技能,导致出现用很复杂的流程和实现方式去验证一件反而简单的事
    • 封装过度,导致代码难以理解和维护(我们不是开发,没必要防御性编程)

-

  • 解决思路:
    • 1>自动化设计就要立足于实际的项目需要,只关注当前项目的核心功能和业务流程,不盲目追求覆盖率,只对关键路径、核心功能和高风险场景进行自动化,不一定动辄就是测试平台
    • 2> 接口自动化性价比最高的就是脚本化(复制粘贴是真的方便)搭配一个成熟的测试框架,不搞花里胡哨的封装和平台化,力求易读、易维护的自动化测试脚本
    • 3> 不追求更高级的技术,注重实用性/快捷性,自动化的关键点不是你用了什么技术去做请求断言返回,而是你的这个用例关注的方向对没。(你用 Java 搞了个平台创建断言了接口返回 和 我用 postman 写了个脚本断言返回,测试结果效果上有什么质的区别吗?)

-


5. 自动化搭建大致过程
  • 1. 选择一个合适的工具
  • 2. 根据我上面主要测试点提取的表,选择需要验证的内容进行断言
  • 3. 利用 codeGeex/gpt 的辅助,一步步把需要完成的自动化搭起来
  • 4. 后续随着用例数和场景复杂了,遇到什么问题就有什么解决什么,你不可能一开始就能想到全部的问题

如果你是用 python,大致用到的就是这些,除了通用的 http 请求,如果有其他协议,就找对应协议的库

测试框架
pytest 用于编写和执行测试用例支持参数化测试夹具等功能
HTTP请求库requests 用于发送HTTP请求方便处理接口的GETPOST等操作
数据驱动yaml 用于存储测试数据例如接口请求参数期望响应等可以使用PyYAML库解析YAML格式的数据文件
数据库连接mysql-connector-python用于与MySQL数据库建立连接执行数据库操作例如验证接口返回的数据与数据库中的数据是否一致
日志记录logbook用于记录测试过程中的日志信息有助于排查问题和进行调试
报告生成allure-pytest结合pytest和Allure生成详细的测试报告提供可视化的测试结果和执行历史


二、目前测试平台有什么奇怪点

了解问题的核心关键在于 “从群众中来,到群众中去”,这句话同样适用于测试岗,很多平台都会标注【独特的用例编写方式】、【低门槛,易使用】的特性,但是实际上都是粗制 web 化的 jmeter 或者粗制 web 化的 postman 又或者是奇葩的低代码拖拽,不仅创建用例麻烦不灵活 且 调试接口费时间,功能细化和封装过度也导致了不小的学习使用成本,且该学习成本不像 jmeter 这种工具的使用经验那样可复用。这些既不能提高效率又不能用来提高测试水平的做法用一句话来形容的话就是:“离群众太远了”。

-

1. 测试平台使用槽点

测试平台交互模式:
- 1. 创建项目 ->创建模块->创建 case->关联项目->关联模块
- 2. 编写 case:请求参数、前后置、预期值等多个输入框,需要逐个点击填写信息 (和 jmeter 创建用例的方式有什么区别?),当接口发生变更时,也是需要逐个用例手动修改信息,维护成本高,用例的可读性也差
- 3.调试 case: 调试信息不够清晰且慢,调试出问题时也无法马上明确是平台问题还是接口本身问题

-

2. 测试平台的设计通病

- 把【低门槛,易使用】理解为:不用写代码就是容易用,抛开实际意义上的实用。
- 太想通用:平台的灵活性本身比较差,为了增加灵活性又为了考虑功能测试不懂代码,通常都会将多种操作流程组件化,增加很多配置项。但是一件产品如果是一端的产出,没有对应的产品、测试和持续的用户反馈,必定会有设计不当或者过度组件化,导致测试用例的抽象层次变得复杂、上手难度增加、执行有性能问题等
- 鸡肋:为体现自身技术,选型难度较大的前后端技术栈,过度追求技术炫耀让平台更难理解和使用,底层逻辑还是走的对返回包的断言,导致难以让人信服。就像赛博丁真绕了个大圈关灯一样

-

3. 意识形态差异:

- 都什么年代了,现在面试功能测试哪个不要求基本的代码脚本能力?,更别说现在都有 gpt 加持,真的不用特别考虑测试无代码能力的场景
- 都是测试,肯定是希望通过写脚本去巩固自己熟悉的开发语言,即使繁琐,也有学习成长的快感


三、写自动化的心理误区

1. 没使用设计模式,很心虚
  • 特别是新手,认为如果没有使用设计模式来编写自动化测试代码,就会感到不够专业或不足够好。
  • 设计模式的确在自动化测试中可以提高代码的可维护性和可扩展性,但并非所有项目都需要复杂的设计模式。如果你只是为了实现简单的接口测试,引入设计模式只会导致代码过于复杂,增加了维护成本。
  • 设计模式是一个不断演进的过程,可以在需要的时候逐步引入,而不必为了设计模式而设计模式。始终专注于编写简单、可读、可维护的脚本。

哪怕你用下面最简单明了的模式,哪又怎样? 能达到自动化的目的即可,干嘛要折磨自己(个人见解,大佬忽略)

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

-

2. 过度关注工具而非测试目标
  • Java 的 TestNG、python 的 pytest、jmeter、postman 还是在前面工具基础上封装平台,本质上都是向目标接口发出请求再进行断言,不管技术实现上有多难,最后实现的测试目标都是一样的。
  • 自动化最终难题都在用例维护和管理上,即使平台化也是如此。
  • 测试用例的设计和执行质量直接影响测试的有效性,良好设计的测试用例可以更好地捕捉潜在的问题,而低质量的测试用例可能导致遗漏重要的测试点

-

3. 一切都可以自动化
  • 自动化是业务逻辑抽象的结果,只是业务逻辑测试的一种方式,相比手工的确是效率更高些,但是需要一个基础条件:稳定的项目

-

4. 试图一步到位
  • 一开始就想覆盖所有的接口和测试场景,徒增压力和维护成本
  • 要逐步增量的方法,从一些核心的接口和关键的测试场景开始,逐步扩展测试范围。

"To be continued。。。"
先记录着,有时间再回来改下,话说社区的 markdown 语法能不能支持下字体颜色还有换行。。。。

共收到 15 条回复 时间 点赞

😁社区里的人太老气了,配点年轻人的图,可以话,我还想全部配美女图片

大道至简

mai 回复

😁 简单实用才是真理,现在搞花里胡哨的又加不了工资,还不如实际点,也少受点罪

看完本篇文章,忍不住地要赞美一下,配图真的不错!😀

爱偷懒的QA 回复


文章谈不上,练练五笔打字的,主要是看图👀

我这都是自产自销,好不好用自己知道,团队也知道🤣

slink 回复


羡慕了

哈哈,感觉这个配图喧宾夺主了,内容写得不错,确实现在很多自动化平台追求低代码化,反而缺少了灵活性,花费的时间更多。

  • 都什么年代了,现在面试功能测试哪个不要求基本的代码脚本能力?,更别说现在都有 gpt 加持,真的不用特别考虑测试无代码能力的场景

其实还是得看公司情况,业务规模上来后只能靠大量堆人去完成测试,简单的自动化也丢给外包做了,但现实是挺多外包真就一点代码不会,即使有代码基础也得培训一段时间才能写脚本。做测试平台纯粹就是给这些人用的,难用总比没得用好

说到心里去了,以前的平台说做,实际目的都是为了 xx 的 xxxxxx,实际用户用着难用的一批。
但是因为各种原因,做出来的东西能用就行,优化根本不给优化。
不搞平台的时候,自己弄点小工具跑一下还好。
弄完平台,再难用也得用,烦的很。

曲曲 回复

其实平台有没有用一件事就可以看出来,就是搞平台的这个人走了后,后面的人又开始重新写一个了😁

测试新人 回复

期待

  1. 意识形态差异:
  2. 都什么年代了,现在面试功能测试哪个不要求基本的代码脚本能力?,更别说现在都有 gpt 加持,真的不用特别考虑测试无代码能力的场景
  3. 都是测试,肯定是希望通过写脚本去巩固自己熟悉的开发语言,即使繁琐,也有学习成长的快感 这两点很赞同,平时已经点点的点够了,自动化测试还让人去点。。。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册