AI测试 AI 自动化就这样实现了

chenyouan · 2021年10月22日 · 最后由 王稀饭 回复于 2021年10月25日 · 1248 次阅读

PS:是不是被这样大高大上标题给吸引进来了,这是一个标题党,它可能不是大家真正意思理解的 AI 吧,就功能不是很复杂,但很实际也贴近业务~ AI 自动化指的是通过自动化收集数据给出需要的数据放到自动化平台进行 UI 自动化测试

想法由来:

是刚好有一次在跟跟开发讨论,说没有方式可以解决,每次验证一个 Bug 的 UI 页面 Bug,都要造数据,恢复到原来的页面,还要点击进去,有什么什么办法,可以直接通过之前测试的数据,直接进入到这个页面,马上验证;开发说,有啊,他们刚好做了一个协议跳转,通过 adb shell am broadcast -a intent.action.debug -n apk 包名/.receiver.GameCenterReceiver --es payload + routers 页面数据,进行跳转,实验了下,贼好用;

协议控制跳转原理:

当控制器之间需要交互跳转时, 只需要将对应的 URL 地址发送到 Router 里, Router 根据其注册的 URL 来寻址到对方信息, 然后负责实例化对象, 并传参, 进行跳转等工作, 各个控制器之间不需要相互依赖对方, 完美解决不同模块之间耦合!

App 内部跳转除了, 频繁的控制器之间切换外, 还有比如跳转到 H5, 或者跳转到 WebView 等;
App 外跳转则包含 Scheme 启动, 3D Touch, UniversalLink, 点击通知等都会触发;
这些包含跳转, 页面切换的我们均可以统一使用 Router 来进行有效的管理, 使 App 变得更加动态化, 模块之间耦合度更低;
支持 H5 跳转
外部 Scheme 启动 App
UniversalLink
3D Touch Shortcut
支持后台动态下发 RouterMap 配置
(PS:上面百度的,其实我就很简单,能为测试我所用,能满足我要求就好,就不会太在意原理)

开发相关一套通用协议,通过安卓广播的方式调用 json 数据进行跳转,原始命令:adb shell am broadcast -a intent.action.debug -n apk 包名/.receiver.GameCenterReceiver --es payload+ 页面数据,页面数据 json 数据为:

AI 自动化设计思路:

通过跟开发了解以后,然后让开发设计一个开关,可以在测试过程中,把相关操作轨迹数据存储到指定的文件夹,并约定如果进行自动化跳转,要给出 log 进行判断;
然后通过开发了一个安卓 app 把测试数据上传到制定的服务器,进行数据排序,也就是热点,知道测试工程师在测试过程中常点击的数据页面有哪些,然后自动化平台就可以通过选择 AI 自动化,上传 apk,然后要执行的前 100 条进行遍历测试还是跳转测试,最终结果通过 crash,anr 和图片进行确认是否有问题;大概原理图就这样

这个技术带来的哪些好处:
1.快速的页面 UI 跳转,特别是通过 scrcpy 可以快速验证复杂的数据,在不同的页面,UI 展示;
2.Bug 验证,不仅是 UI,通过在 bug 的数据,开发可以快速定位到页面;
3.自动化用例介绍了,直接跳转到制定页面,直接断言或者查找有没有这个 ui 或者这个数据,就成功,提高自动化的效率;
4.可以有序的进行遍历测试,通过自己测试的轨迹,对自己的操作的页面,进行有序的遍历测试;
5.常规功能的回归测试,接口测试,AI 自动化方式,保证用户常用功能不出问题;

以上,整体来讲,技术没有很高大尚,就简单数据驱动自动化测试吧,但就是落地了,瞎整了一个月,执行效果还不错。存在的缺陷就是我们操作的轨迹毕竟是重复的,希望能通过算法,让这些操作具有 “逻辑性”。

具体的设计,原理,带来的好处,工具实际操作,功能演示,有兴趣的可以点击以下链接进行了解;

AI 自动化就这样被实现了(一)

AI 自动化就这样被实现了 (二)

AI 自动化就这样被实现了 (三)

AI 自动化就这样被实现了 (四)

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞

恩,感谢分享思路。这个目前是针对安卓端测试吧。

没看到 AI 的价值体现啊,大佬

被标题吸引进来了,思路确实是挺特别的,基于 app 内部提供的 router 组件统一跳转机制,达到跳转到任意页面的能力。以前我们公司内的 app 架构师也有分享这个,通过 router 来把各个页面组件进行解耦,提高复用性。

有几个疑问点,想交流下:

1、这种 router 提供的能力,主要是 app 部分的,但进入页面后请求服务端数据,还是需要依赖服务端。一般服务端数据也会可能因为有其他人操作导致变化,会引起无法正常回放,这块是怎么处理的?
2、从楼主分享来看,自动回放/遍历方面主要关注 crash/anr ,而这种跳过所有前置步骤直接进入目标页面的方式,会不会导致一些长时间运行才会出现的问题或者组合页面才会出现的问题(比如对一些公共层数据的操作),无法出现?
3、不知道楼主在标题特意强调的 "AI" ,指的是哪部分?微信的文章也看完了,没太看到在哪里运用了 AI 。

陈恒捷 回复

1.直接请求服务端,数据已经存储在你手机本地文件,不会被别人所影响;
2.自动回放,我们主要是关于页面能不能跳转,也就是根据你操作的步骤,可能有一个误解,轨迹的回放,其实就是你操作的步骤加数据,所以可以保证你之前的页面,没有问题,而遍历测试指的是有序的遍历,比如你操作的了 A-B-C 页面,就会对先对 A 页面所有控件进行点击,执行完,再执行 B 页面,不会类似 monkey 的无序遍历;router 协议跳转,无法全部像有序功能测试全部验证逻辑,但一大部分可以验证,比如,进入 a,在进入 B,在进入 C,在 D 验证逻辑,那我就可以直接先进入 C,在 D 验证逻辑,数据都是我录制就有的;
3.AI 的话,其实就是测试工程师测试完以后,apk 自动化上传测试的数据,服务端根据数据进行排序,类似排名,来确认这个版本哪些页面经常操作,并且这些页面是什么数据的,然后自动化就会定时去获取这些数据,进行页面跳转测试或者页面的遍历测试。其中 AI,就是自动化对数据的解析,最简单的应用。其中这个算法跟数据,还有很大改进。我们只是简单运用。

以上,是我个人对这些的问题的回复。

是的,是指针对安卓端的。

我们内部有实现了一套差不多的玩意,我们管这叫 scheme 定向测试,只是说,可能定向过去的是一个原生页面、前端页面、内部其他技术制造的页面等。

其实有弊端:

  1. 并非所有页面都能这样跳转,需要页面自身支持这样跳转才行。
  2. 跳转本身所携带的参数是你在收集那一刻就被写死的,它缺少了动态的变化,跳转过去遍历测试一样会存在覆盖的死角。

不过还是有很多场景可以应用这种测试方式的,比如提高测试覆盖率、线下问题复现压测、某些特殊场景的定向测试。

如果要结合遍历测试来做,还需要预防跳转过去后,monkey 给你点到回退到其他页面了。

王稀饭 回复

如果要结合遍历测试来做,还需要预防跳转过去后,monkey 给你点到回退到其他页面了

这个不是用 monkey,自己要写算法,遍历页面的。
弊端有,还有返回的时候,是没有轨迹的。另外你说的没有支持的,h5 页面就没有支持,有些没有支持的,要增加,这是一个增加自动化测试的案例,有些是需要其他方案补充的。

chenyouan 回复

1.直接请求服务端,数据已经存储在你手机本地文件,不会被别人所影响;

没太明白。比如金融类业务,“账户余额” 数据是服务端返回的,不可能 app 内置,也不应该存储在手机本地文件(安全性考量)。这类数据不会变化么?还是说你们的业务,确实就全部 app 存储数据?

2.自动回放,我们主要是关于页面能不能跳转,也就是根据你操作的步骤,可能有一个误解,轨迹的回放,其实就是你操作的步骤加数据,所以可以保证你之前的页面,没有问题,而遍历测试指的是有序的遍历,比如你操作的了 A-B-C 页面,就会对先对 A 页面所有控件进行点击,执行完,再执行 B 页面,不会类似 monkey 的无序遍历;router 协议跳转,无法全部像有序功能测试全部验证逻辑,但一大部分可以验证,比如,进入 a,在进入 B,在进入 C,在 D 验证逻辑,那我就可以直接先进入 C,在 D 验证逻辑,数据都是我录制就有的;

这个理解了,感谢。

3.AI 的话,其实就是测试工程师测试完以后,apk 自动化上传测试的数据,服务端根据数据进行排序,类似排名,来确认这个版本哪些页面经常操作,并且这些页面是什么数据的,然后自动化就会定时去获取这些数据,进行页面跳转测试或者页面的遍历测试。其中 AI,就是自动化对数据的解析,最简单的应用。其中这个算法跟数据,还有很大改进。我们只是简单运用。

这个在我目前看到的内容来说,只是聚类或者排序算法层面,还不属于 AI 吧?AI 一般特指机器学习或者强化学习,最基础需要有模型、特征、预测值这些,但你这里都没见到有相关的信息。不建议把所有算法都套上 AI 这个名字,容易变成标题党引起反感。

chenyouan 回复

我理解是一样的道理,算法在 monkey 上的作用就是决策下一步要点击哪个空间获得的 “收益” 更大,还是有可能直接给点 “返回按钮”。
我表达的意思是,这个手段在使用细节上还是有很多测试策略需要考虑的

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