对于ui自动化常见的就是基于控件的自动化,比如常见的xpath、id、css选择器等手段进行元素定位并进行结果判断。 在实际应用中,无论是web端还是移动端,仍有很多时候需要根据页面内容、页面中的图像进行定位及判定,是这些手段所达不到的。以下便是图像识别在测试中的应用:
图像识别在测试中能够想到的引用场景:
测试过程中,通过对待测软件进行屏幕截图,采用图像识别算法识别截图中是否包含预定义的可操作控件,如果存在,则触发控制指令,达到了图像识别引导测试过程的目的;测试结果的验证,通过对待测软件的界面进行截图操作,利用图像识别技术将截图与期望的结果进行匹配,从而自动获取测试结果。通过图像识别对比来进行性能测试,比如app测试中常见的响应时间的测试图像识别在自动化测试中的应用,目前比较流行的就是sikuli,sikuli脚本是由jython通过图像识别的方式来模拟键盘和鼠标事件,从而实现ui层面的自动化测试。sikuli脚本的核心是一个Java库主要由两部分组成:
例如:当编程人员想要编写一个脚本,实现如下功能:当上班时所乘坐的公交车到达某一站点时,自动向手机发送一条提示信息。如果是在以前,需要对相应的坐标进行确定,并通过文本的方式将其编写成代码。而如果在当地公交车网站上有一个通过谷歌地图绘制的公交路线图,而且上面有活动的指标,那么编程人员便可将路标移动到需要发送短信的位置,并进行截图。这样一来,只需要将该截图插入到if之后,即可设定好条件语句,从而触发特定的信息。当然这同样需要具备一些基本的编程基础。 2. 进行大规模的程序测试,例如某一按钮是否正常工作,这时,通过sikuli来调用待测试的按钮便可节约大量的时间。 3. 可用于可视化搜索,例如,对生活中的某一事物拍摄照片,即可搜索相关的信息;或是在某一地区迷路,只要将周围环境的照片上传到搜索引擎,便可得到相应的地理位置。
优点:
介绍到这会有人问有了webdriver等ui自动化后为什么还要用图像识别呢?我能想出来的理由也只有这几点了:
1、代码简单易懂,简单到什么程度呢?可以说会截图就可以进行自动化测试 、
2、针对一些游戏或者一些特殊的应用ui控件比较难以识别这样就可以通过图像识别轻易的找到对应的元素
3、代码的学习成本比较低常用的函数已经封装完毕,而且简单易懂。
4、工具开源可以进行二次开发
5、可以识别类似flash这样不能通过识别控件来进行自动化测试的项目
缺点:
1、 屏幕不能有遮挡,因为sikuli是在当前桌面识别 对应的目标并进行操作,如果桌面有遮挡就会导致对应的元素找不到
2、 如果代码换一个显示屏进行测试就要重新进行截图,因为之前所有的截图分辨率已经不适应当前界面
利用图像处理的知识来进行测试:
高分辨率图片的测试,如果直接测试的话,可能会比较耗费内存,而且不太容易,可以利用我论文1中的滑动窗口方式,对一张大的图片进行有重叠的滑动裁剪,然后测试。当我们需要检测界面上的一些内容的时候,比如说检测某个图标是否在某个位置,那我可以运用之前目标检测的知识来进行目标定位,然后之后通过目标识别的方法来确认目标,还可以做到目标的精确定位。虽然说现在很多的测试工作都可以使用工具解决,但是享有一些特殊的情况,比如说测试的物体有部分遮挡的,或者是物体呈现形状不规范时,可以运用一些图像处理的方式来解决,像我项目2中对于三角形交通标志的检测,就考虑到了遮挡和标志扭曲、旋转的问题,通过利用一系列形态学的方法将这些问题得以处理。http://baijiahao.baidu.com/s?id=1600130991375273135&wfr=spider&for=pc
人工智能的发展也并非一帆风顺——比如说无人驾驶汽车的致命交通事故、人工智能系统的种族主义反应、图像标签软件不恰当的标签等。所以说对这些系统进行有效的测试是非常有必要的。
举一个例子:某个推荐系统可能无法实时地独立地工作,它将集成到一个互联网应用程序之中,为用户提供实时产品推荐。
各个层级的测试: 在数据摄取层,验证系统能够接受来自各种来源和各种格式的数据是很重要的(数据的普遍性,泛化性,特殊性),需要验证所摄入的数据是否按照目标系统所期望的格式转换。在选择算法时验证系统的准确性需要测试第三方接口。测试人工智能系统如何满足总体业务目标。https://blog.csdn.net/u010312649/article/details/79016049
模型评估测试 模型对未知新数据的预测能力,即泛化能力 泛化能力越好,模型的预测能力表现越好,为衡量模型泛化能力的评价指标,就是性能度量。性能度量一般有错误率,准确率、精确率、召回率等。
稳定性/鲁棒性测试测试算法多次运行的稳定性,以及算法在输入值发现较小变化时的输出变化。如果算法在输入值发生微小变化时就产生了巨大的输出变化,就可以说这个算法时不稳定的。
系统测试将整个基于算法模型的代码作为一个整体,通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。
接口测试文档测试----------- 测试数据 ------------
测试人员使用的测试集,只能尽可能的覆盖正式环境用户产生的数据情况。正式环境复杂多样的数据情况,需要根据上线后,持续跟进外网数据。算法模型的适用性一定程度上取决于用户数据量,当用户量出现大幅增长,可能模型会随着数据的演化而性能下降,这时模型需要用新数据来做重新训练。上线只是完成了一半测试,并不像APP或者WEB网站测试一样,测试通过后,发布到正式环境,测试工作就完成了。
测试集的选取遵循两个原则:
测试集独立同分布测试数据的数量和训练数据的比例合理当数据量比较小时,可以使用 7 :3 训练数据和测试数据,当数据量比较小时,可以使用 7 :3 训练数据和测试数据。
如果数据量是百万级别,那么验证集和测试集占数据总量的比例会趋向于变得更小。如果拥有百万数据,我们只需要1000条数据,便足以评估单个分类器,并且准确评估该分类器的性能。
算法工程师提测时,写明自测时的准确率或其他指标。测试人员另外收集自己的测试集。 测试数据可以测试人员自己收集。或者公司的数据标注人员整理提供。或者爬虫。外部购买。 测试人员可以先用算法工程师的测试集进行运行测试查看结果。再通过自己的测试集测试进行指标对比。
---------------测试用例-----------------
收集测试数据思考需要什么样的测试数据,测试数据的标注
跑测试数据编写测试脚本批量运行
查看数据结果统计正确和错误的个数,查看错误的数据中是否有共同特征等
--------------测试结果----------------- 核心即:测试结果和预期结果对比
AI测试与APP测试不同的是,不想App测试一条测试用例执行结果和预期不一致就会记录为一个bug。算法测试不太关注单个结果,关注整体的一致性。有点类似于计算得出整个测试用例的通过率
不过是自然语言处理语音语义识别还是计算机视觉的图像处理,都需要有一些标注数据,也就是知道预期结果,才能展开测试。推荐系统不一样,你不会知道具体会推荐那一条,可能只会知道大概类别范围,所以无法给出标注,预期结果。
测试人员大部分时间会花在构造语义测试数据阶段,尽可能的收集各种语境和语义输入。
不同于向淘宝、亚马逊、抖音这样的推荐,一没这么大的用户量,二没那么多内容,所以有些测试方法会不适用这些项目,测试方法也较大不同。
Face Recognition 包括Face Verification和Face Identification
VerificationVerification 是每次进行一对人脸图像的比较,判断是否是同一人 验证任务下提交两张图像,比较两张图像,得到相似度值,如果该值超过了指定阈值,则完成验证,否则无法通过验证。
IdentificationIdentification是每次输入测试图像,在包含多个人的底库中查看输入的测试图像和那个人更像。
根据测试图像所代表的人员是否位于底库内,可以将Indentification 分为Colsed-set indentification (人脸闭集识别) 和 Open-set indentification (人脸开集识别)
人脸闭集识别:测试图像表示的人员一定位于底库中。 人脸开集识别:是人脸闭集识别的泛化,人脸识别系统需要首先判断测试图像表示的人是否位于G中,如果是,那么他是谁