如何处理不稳定的自动化测试?

一、文章来源: mp.weixin.qq.com
忘记原文链接了

abluecolor
在解决这个问题之前,请停止编写更多测试,因为这将花费你较高的测试维护成本。你需要尽快行动起来对不稳定的原因进行深入研究,找到不稳定的根因,并且尝试在流程、环境和代码方面做一些优化工作解决它。
MasterKindew
如果你还没有在测试里增加测试日志记录,那么专门花时间补充日志会对你大有帮助,让框架抛出错误并明确测试的错误。如果你的用例通过使用前端自动化框架开发,那么在发生故障时截图的内容将会很有帮助。
hitchdev
这是一个非常普遍的问题,也是一个很难解决的问题。
我的解决方案:1 使测试完全闭环。测试是否有通过网络发起对外请求?如果有的话请使用模拟 API 代替。是否使用数据库?使用固定数据在本地设置数据库,并在每次测试后将其清除。在实践中,我认为几乎没有人使端到端测试是密封的。这非常非常难。不过,这是一个值得实现的目标,原因不仅仅是脆弱。2 删除测试中所有类似于 sleep 的内容并用显式等待代替。3 识别代码中不稳定因素并修复或消除它们。4 这个问题确实很棘手,因为你要么需要成为开发人员,要么需要开发人员的支持来解决这些问题。问题如下:

针对前两步我这里分享一下解决方法。我们的不稳定用例主要有以下几类:

  1. 用例不闭环,调下游的服务不稳定导致用例频繁失败。
  2. 用例有查询 DB 的模块,因为经常出现慢查询的情况。
  3. 测试环境服务器不稳定,这里表现为与线上环境相比,配置不一致甚至缺失。
    1. 这里的配置有 DB 的表结构、参数中心等 那么对应的解决方法:
  4. 对依赖下游的服务进行 mock。
  5. 慢查询 SQL 进行优化,实现基于索引查询数据。如果无法实现基于索引查询,就对查询 DB 的 SQL 增大 timeout。 解决不稳定用例是一个持久仗。问题的关键在于 如何做到用例的保鲜? 目前我们用例保鲜的方法就是 通过增加 0 成功率机器人,每日更新 0 通过率用例,频繁处理不稳定用例。当然这个方案仍不是治本的最终策略,但是在一定程度上能解决了回归耗时较长的问题。

*以上文字均来源前面链接的文章 && 下面为个人简短思考 *

二、个人思考
Author:xxx
今天在公众号看到上面这篇文章,有感而发,对上面文章及思考, 针对不稳定的因素有部分补充及同感,
一句话:没有解决不了的稳定性因素,如果有那就是处理不够好

  1. 用例设计不当,(用例设计不当分好几种)
    1. 编写的代码逻辑不够严谨,代码本身不够稳定,
    2. 等待获取数据, sleep 过多,
    3. 用例不够独立,依赖上游数据导致失败,或者依赖太多,
    4. 用例和测试数据不够独立,
    5. 慢查询

总结:个人认为 这种均可以解决,且也好解决,但是这也是目前遇到的不稳定因素中比较多的,
解决:需要详细分析不稳定的因素 - 需要对日志分级,对不稳定的因素分类,给出详细的解决方案,

  1. 测试环境服务器的不稳定,

    1. 这种需要运维和研发,测试 共建稳定的测试环境,这是做好自动化的前提,不细说;
    2. 当然存在测试环境不稳定的情况 (只是相对 online 环境), 需要有部分重试的机制,得需要根据场景来细说;
  2. 自动化用例都有,但是没有发现问题

    1. 遇到过很多人写的脚本执行就是发现不了问题,有的人写的能够发现一些问题,
    2. 用例设计的场景是关键,好的用例可节约很多的回归时间!
    3. 用例效验的数据,

================ 针对上文原作者内容评论 ======================

测试报告包含:

不稳定的测试处理方法,可以归结为以下几种:

  1. 用例开发角度:适当记录用例执行日志;用例编写自闭环,多使用 Mock。 -> 用例闭环很重要,很多人没意识到! 数据的独立性 !
  2. 识别并消除测试中不稳定因素,例如 sleep。 -> 赞同
  3. 建议消除重试机制。 -> 赞同,我这指的是单个用例的赞同,整个工程可定制配置重试机制,可排除部分环境因素导致的失败!
    1. 重试机制有个作用就是排除环境因素,不好的地方稳定性问题可能没有暴露,但是如果每天都执行,不稳定因素迟早会暴露的,
    2. 重试机制 - 会增大用例执行时间,
  4. 增加测试不稳定告警机器人。 -> 赞同,可脚本可平台查看用例执行的历史记录,

那么如何处理不稳定测试?我们的处理方式分三步:

  1. 搜集问题用例,分析报错原因,对问题进行归类。 -> 赞同
  2. 针对已知问题进行优先修复。 -> 赞同
  3. 增加 0 成功率机器人,用例每日告警。 -> 赞同

建议增加代码评审环节,排除代码本身不够严谨导致的问题或者其他问题,集思广益,一起探讨思考不足之处;

针对前两步我这里分享一下解决方法。我们的不稳定用例主要有以下几类:

  1. 用例不闭环,调下游的服务不稳定导致用例频繁失败。-> 用例不闭环,数据不闭环导致!
  2. 用例有查询 DB 的模块,因为经常出现慢查询的情况。 -> 分场景处理
  3. 测试环境服务器不稳定,这里表现为与线上环境相比,配置不一致甚至缺失。-> 建议执行之前先 setup,初始化或者自动化检查配置信息即可,没有就创建 (均自动化流程实现)

解决不稳定用例是一个持久仗。问题的关键在于 如何做到用例的保鲜?
目前我们用例保鲜的方法就是 通过增加 0 成功率机器人,每日更新 0 通过率用例,频繁处理不稳定用例。当然这个方案仍不是治本的最终策略,但是在一定程度上能解决了回归耗时较长的问题。
用例不稳定主要还是人为因素导致,建议 框架清晰,用例及数据独立,增加代码 review 环节,排查代码本身存在的处理逻辑,设计等等不合理的场景,可以解决 97% 以上的不稳定因素;

需求变动或者接口变动导致的用例修改的场景,怎么样才能更快更好的重构相关用例的场景,主要是高质量的用例,这是需要思考和探究的地方 ?
监控变动记录均已实现,简单的重构用例也可以实现,重在高质量 !


↙↙↙阅读原文可查看相关链接,并与作者交流