自动化工具 图像分类在兼容性测试中的应用

williamfzc · 2022年06月25日 · 最后由 xiaochonger 回复于 2022年07月11日 · 5395 次阅读

背景意义

这篇文章来自于两年前的 issue:https://github.com/williamfzc/stagesepx/issues/158
前阵子发现有同学这么落地了,觉得挺有意思的,实验了下,作为一个官方 api 开放出来吧
新功能可能会有奇奇怪怪的潜在问题,欢迎交流

随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。

而很多兼容问题在显示层发生,例如黑白屏花屏、显示不及预期等,自动化评测开展的门槛比较高。

方案

一般方案分为两个部分,驱动层与校验层:

驱动

  • 录制回放:通常是将操作过程保存下来,下次直接拿出来回放
  • 脚本回放:常规 UI 自动化

当然现在两种会结合起来用,例如录制回放后保存的形式就是自动化脚本,你可以在此基础上进行编辑。

校验

  • 自动化校验:常规 UI 自动化,控件检测等
  • 人工校验:将整个过程进行录屏,人工统一验证

同样会结合起来用,自动化校验一些关键位置,人工检验整体表现。

难点与思路

  • 现阶段自动化校验的能力比较有限,许多还靠控件检测,而随着 web 技术的兴起,控件检测在技术上越来越受挑战,脚本变更频繁
  • 图像算法维度,对关键图、脚本的维护成本并不低,算法能选择的也有限
  • 全自动化(如自动遍历)的兼容性测试在心理上接受度有限,你无法控制判断一些流程是否符合预期

本文尝试在图像校验的角度,利用 stagesepx 实现简单的自动化校验功能,提供一些新的思路。

小例子

这里展示了 chrome 打开一个页面的情况。可以发现,在不同机器(ios、android 的不同版本)、不同版本上,同一个应用的表现可能是不一样的:

https://testerhome.com/topics/22215 类似,我们可以用类似的方式将整个过程拆解为几个阶段:

  • 0:待机页
  • 1:chrome 开屏页
  • 2:loading 页
  • 3:真正的内容页

而 chrome 开屏页在低版本的 android 上不会出现。我们假设,我们希望 chrome 在不同版本上表现是一致的,0 1 2 3,那么开屏页不出现就是一个兼容性问题。

那么只要跟原来一样准备好训练集:

使用原有脚本,简单变更即可轻松断言(脚本与使用可以参考 https://github.com/150109514/stagesepx_with_keras,不再赘述):

from stagesepx.classifier.keras import KerasClassifier
from stagesepx.cutter import VideoCutter
from stagesepx.reporter import Reporter
from stagesepx.video import VideoObject

video_path = "android-new4.mp4"
video = VideoObject(video_path)
video.load_frames()

cutter = VideoCutter()
res = cutter.cut(video)
stable, unstable = res.get_range()

# 0.9为置信度
cl = KerasClassifier(0.9, epochs=20)
cl.train("./chrome_startup")

classify_result = cl.classify(video, stable, keep_data=True)

assert classify_result.is_order_correct(["0", "1", "2", "3"]), classify_result.get_ordered_stage_set()

可以看到 1 阶段(开屏页)没出现:

如此即可将一个流程检测集成到你们的常规流程中了。

更复杂的实际例子

对于兼容性我们不可能只看一个启动,通常会更加复杂。这里以雪球为例:

简单一点说,雪球一眼进去,主要页面有五个:

要测兼容性,一般都是将主要的页面都过一遍。过一遍好过,但校验是个问题。

一样的方法,将图片分类整好,按照你的遍历方式,选择需要的断言即可。例如你的自动化脚本/录制回放是沿着 0、1、2、3、4 来的:

assert classify_result.is_order_correct(["0", "1", "2", "3", "4"]), classify_result.get_ordered_stage_set()

我们找一个异常状态(页面表现不一样)的视频:

可以看到 1、3、4 都没有出现并被正常检测出来。

而只要有一套训练集,他同样可以被复用到不同机器上。细心的同学可以看到我的训练集甚至用的是 iphone 的截图。

而,如果闪屏页样式很多,而又不是你关心的重点,你也可以直接忽略掉他:

assert classify_result.is_order_correct(["1", "2", "3", "4"]), classify_result.get_ordered_stage_set()

或者,只关心 1 与 4 是否出现?同样可以只确保 1 与 4 按照顺序出现:

assert classify_result.is_order_correct(["1", "4"]), classify_result.get_ordered_stage_set()

还有一些更特别的。例如你不关心是否按顺序出现:

assert "1" in classify_result.get_stage_set() and "4" in classify_result.get_stage_set()

或者利用一些自动遍历工具做的测试,产出物是一堆图片,不是视频,只是想看看这些图片是不是符合。你也可以直接利用 stagesepx 自带的分类器满足你的需求:

cl = KerasClassifier(0.9, epochs=20)
cl.train("xueqiu")
res = cl.predict("./xueqiu/1/5db49c10-94de-4a5e-a930-692ad88efad7.png")

print(res)
# 这张图片被分类为类型1

一些常见问题

模型每次都要训练吗?

不是,你可以保存。图中只是为了简化描述:

YOUR_MODEL ="./YOUR_MODEL.h5"
if os.path.isfile(YOUR_MODEL):
    cl.load_model(YOUR_MODEL)
else:
    cl.train("xueqiu")
    cl.save_model(YOUR_MODEL)

每次都要解析视频,很慢?

功能测试跟性能测试的出发点完全不同,在兼容性、功能测试的时候 FPS 的敏感度小多了,可以大大降低来提升分析效率。

分类不准确?

可以参考之前的其他文章来简单调优。

相关链接

共收到 3 条回复 时间 点赞

您好,是对录屏分帧,然后判断分帧后的图片是否是 Ui 兼容性问题是吧?

笑哼 回复

对的

你好 想问下页面在不同的手机机型上打开的时间不同,录视频分帧生成的图片可能和基准的图片不对应,这块怎么解决的?

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