如何生产兼容性强的自动化测试脚本

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 如何生产兼容性强的自动化测试脚本

如何生产兼容性强的自动化测试脚本



在阅读本教程前,请确保先阅读我们的5分钟上手教程


提纲



通过阅读本小节教程,你将了解以下内容:


  • 如何选择Airtest/Poco
  • 提高截图脚本的兼容性
  • 提升脚本运行速度
  • 如何快速验证脚本兼容性


一、如何选择Airtest/Poco



    在测试脚本中,我们可以同时使用图像脚本(Airtest)和UI脚本(Poco)。相比于图像脚本,UI脚本更加精确、运行速度更快。我们在撰写脚本时,应该如何使用这两种类型的脚本呢?


这与待测应用的类型有关:


  • 原生app:


  • 建议直接使用Poco的UI脚本,在必要的界面判断时用图像脚本。


  • 游戏:


  • 已集成poco-SDK,使用Poco的UI脚本,必要界面使用图像脚本
  • 暂时无法集成SDK,使用图像脚本。


二、提高截图脚本兼容性



1.截图脚本常见的问题情景2


在脚本测试的过程中,有时候我们会遇到下面这些情况:


①之前写好的截图脚本在更换一台不同分辨率的手机/更换一个环境之后,就经常遇到执行失败的报错:



报错的文字版本是:


airtest.core.error.TargetNotFoundError: 'Picture Template(E:\\test\\pycli\\untitled7.air\\tpl1570692325989.png) not found in screen'
复制代码


这是因为图像识别具有一定的误差,在不同分辨率的设备上,或是画面发生了一定变化的情况下,可能会造成图像识别效果不如预期的情况。我们可以尝试各种方法修改截图,来获得更高的截图识别成功率。


②运行后查看报告,发现识别出来的位置是一个错误的位置,但是airtest当做是正确的。这种情况下,就需要通过调整截图、调整阈值之类的手段来修改脚本。


③运行后查看报告,报告里能看到识别到了正确的位置,也点击成功了,但是实际上没有成功点到。



这是因为在脚本编写过程中,如果有连续点击操作,屏幕内容可能会不断变化,有时候会导致脚本明明运行到了点击操作却发现没有生效的情况。这是因为屏幕内容切换速度过快,界面还未稳定的同时airtest就进行了元素识别和操作,导致没有成功点击到对应元素。


因此我们通常建议,在一些操作步骤结束后,适当等待一个合适的时间再进行下一步操作,例如:


from airtest.core.api import *
start_app("test_package")
sleep(5)
touch([500, 500])
sleep(1)
touch([600, 0])
复制代码


2.提升截图脚本兼容性的方法


2.1截图技巧


①截图时尽量保证截取的图像辨识度高、独立清晰 ,例如截取一个按钮图像时,尽量不要带上太多的嘈杂背景图案,避免在背景变化后难以成功识别的问题。


这样干净的截图:



会比这样的截图好:



②图像识别使用的算法更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字的识别成功率很低,请尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容。


若有大量重复的、非常相似的图标堆叠在一起时,有可能识别效果不佳,在我们眼中也许每一个图标上面的文字是不一样的,然而在Airtest的眼中它们实在是太相似了。我们可以尝试修改截图,借助一些其他的背景样式,修改成辨识度更高的图片。 例如对于这样子的界面:



我需要点击中间第二个【安装】按钮。如果直接截图可能根本点击不到,或者点击到错误的按钮。


但是如果我们换一种方式,截取拥有更多特征的图片:



,返回的结果则会是正确的。因为Airtest默认点击的是我们截图的中间位置,所以这样截图正好可以实现点击第二个【安装】按钮的效果。下文我们还可以通过设置点击位置traget_pos,来实现第一个或第三个【安装】按钮的点击。


④尽管我们提供了便捷的自动录制功能,能够直接将当前所有操作一步一步转换成代码,但是这种情况下自动截取的图片往往不太理想,需要手工再对截图进行调整。下图是使用自动录制功能截出来的图片,可以看出截图的特征并不那么明显。



2.2合理调整阙值


在每行图像识别脚本运行的时候,包含三个步骤:① 图像识别的初步识别结果;② 计算结果可信度;③ 通过脚本中的阈值筛选结果。



脚本中的阈值在这里起到结果筛选的作用,阈值的高低将直接影响到返回的识别结果:

阈值过高:可能导致把低可信度的初始结果全部过滤掉,最终没有有效的图像识别结果。

阈值过低:可能导致返回的是错误结果(没有正确识别结果的情况,因为阈值过低使得错误结果得以通过筛选)。


我们在提升图像脚本兼容性的时候,最重要的一个部分就是设置合理的阈值。Airtest框架中的默认识别阈值为0.7,我们可以进行适当调整。


使用“图像编辑器”调整单行脚本阈值


我们一般使用“图片编辑器”修改阈值。在脚本框中双击图片打开“图片编辑器”,我们可以实时调节右侧的threshold阈值数值,并点击Snapshot + Recognition按钮来实时验证识别结果。识别结果的可信度会直接呈现在下方状态栏上,可信度大于阈值时才会返回识别结果:



注意: 建议阈值设定在[0.6, 0.9]之间,避免阈值过低混入错误结果、或者阈值过高导致经常找不到结果。


设置脚本的全局阈值


如果我们想直接为整个测试脚本的图像脚本设置阈值,则可以在脚本开头时进行全局阈值的设置:


# 全局阈值的范围为[0, 1]
from airtest.core.setting import Settings as ST
ST.THRESHOLD_STRICT = 0.7  # assert_exists语句的默认阈值,一般比THRESHOLD更高一些
ST.THRESHOLD = 0.7  # 其他语句的默认阈值
复制代码


2.3利用灰度图识别


在识别图像时,Airtest会先将图像转为灰度图再进行识别。因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。如下图,如果仅截图第二个红色的【删除】按钮,Airtest会把另外俩个灰黑色的【删除】按钮认为是相同的。



通过勾选rgb选项(双击图片打开图片管理器勾选),或在代码中加入rgb=True,我们可以强制指定使用彩色图像进行识别。这样就能比较好地识别出那个红色的【删除】按钮了。


2.4设置点击位置traget_pos来进行点击


当识别出一张图像后,Airtest将会默认去点击图像的正中心位置,有时我们希望它识别出图片后点击其他位置,就可以通过修改target_pos属性来实现。


例如:



在上图中,我们希望点击中间选项的“升级”按钮,不希望点到别的选项去,而只截出升级按钮不能满足我们的需求。


此时我们可以考虑将截图范围扩大到红色虚线框选的区域,截图后将这张方形图片视为一个九宫格,方框上的每一个暗色红点都代表一个数字,将希望被点击的位置设置为target_pos的值即可。在这个例子中,我们可以让截图区域的底部正好放在“升级”按钮上,然后设置target_pos=8即可正好点击到该按钮。


target_pos取值范围是1~9,[1, 9],且必须为整数,默认值是5(图像正中心)。同理,上文的安装按钮的例子,也可以通过设置target_pos来识别第一个和第三个按钮:



2.5自定义语句提高图像脚本兼容性


对于设备长宽比不同、设备分辨率不同、多种字体的情况,我们可以通过语法来提高兼容性。这种方式需要连接上脚本兼容性有问题的设备,把对应截图纳入搜索列表。代码脚本如下:


picList = [pic1,pic2,pic3]  # 截图的图片对象列表
for pic in picList:
     pos = exists(pic)
     if pos:
         touch(pos)
         break  # 只要找到图片列表中的任何一张图片,就执行touch
复制代码


注意:如果for循环中没有break语句,会导致次逻辑运行时将所有的图片都找一遍(找到后执行touch),而非找到合适结果立即返回。


3.指定游戏的分辨率适配规则


在使用不同分辨率的设备进行图像识别时,可能会导致识别成功率不佳,因此Airtest提供了默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则),代码在这里。


想要提高2d游戏的识别精度,最好的办法就是明确指定你的游戏的分辨率适配规则,例如,直接在.air脚本文件的开头这样写:


from airtest.core.api import *
def custom_resize_method(w, h, sch_resolution, src_resolution):
    return int(w), int(h)
# 替换默认的RESIZE_METHOD
ST.RESIZE_METHOD = custom_resize_method
复制代码


上面的代码指定了一个自定义的缩放规则:直接return原来的值,不管屏幕分辨率,所有UI都不进行缩放(有的游戏就是这种策略)。


这里的RESIZE_METHOD,即我们定义的custom_resize_method使用的输入参数为:


  • w, h # 录制下来的UI图片的宽高
  • sch_resolution # 录制时的屏幕分辨率
  • src_resolution # 回放时的屏幕分辨率


输出为:


  • 回放时的UI图片宽高


若要自定义你的RESIZE_METHOD,只需要知道你测试的游戏的缩放规则,然后在custom_resize_method中用代码实现即可。这样做,能够大大提升不同分辨率设备下的图像识别成功率。


4.拓展阅读


Airtest采用的多种图像识别算法的效果比较,可以参考这里


三、部分场景下的便捷操作



在部分场景下,通过一些替代性操作(比如直接操作坐标、使用按钮指令、记忆元素位置等),可以省去对图像识别的兼容性调试,甚至可以加快脚本执行速度。


1、 操作坐标


1.1 操作坐标案例一:过场动画


比如过场动画会很慢,我们可以选择跳过,这时就可以使用坐标进行设备操作。如下图的游戏过场动画:



# perform a simple click
touch([10, 10])
复制代码


1.2 操作坐标案例二:App介绍页


在考拉app打开后,有4个介绍页滑动后才能进去。如果通过airtest/poco的UI测试语句,需要运行半天。而通过直接使用固定坐标位置滑动,执行四下即可。要注意的是,这里坐标脚本的连续运行操作得太快,设备甚至有可能会反应不过来,一般每行语句后面需要加一下sleep(1.0),等待一下设备响应。



如果这种情形非常多的话,可以封装成通用的函数,用到的时候调用一下即可。 省代码+快速~


# get the device width & height
width, height = device().get_current_resolution()
# cal swipe (start/end) point coordinate
start_pt = (width * 0.9, height / 2)
end_pt = (width * 0.1, height / 2)
# swipe for 5 times:
for i in range(5):
    swipe(start_pt, end_pt)
    sleep(1)  # wait for the device's response
复制代码


2、 使用手机按键指令



很多情况下,BACK按钮可以进行灵活使用。经常在点开一个页面,想返回上一个页面时,可以选择按UI按钮,但是一般keyevent(“BACK”)也可以达到目的,简单直接-兼容性又好。


3、 位置记忆


    还有一些特殊的情形,比如炉石中,敌我双方的英雄位置是固定的,每次攻击敌方英雄的时候都需要用到这个位置。 可以考虑全局保存位置,之后需要使用的时候直接调用对应位置就行了。



上图中需要注意的是,需要使用wait语句来等待获取到英雄位置,而不是exists。因为这里一定是需要拿到对应英雄的位置,需要等待其出现(不出现直接触发报错),而exists语句如果没有英雄出现不会报错。



上图中,需要随时使用随从攻击对方英雄时,直接将随从图片swipe至地方英雄的位置就可以了。


四、借助多设备运行功能验证脚本的兼容性



通过我们的新功能——多脚本多设备插件,来验证脚本的兼容性。通过同一个测试脚本同时在多台不同分辨率的设备上实际运行,以确保脚本的兼容性。


相关文章
|
1月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
1月前
|
存储 监控 测试技术
测试脚本编写和维护的最佳实践有哪些?
测试脚本编写和维护的最佳实践有哪些?
119 50
|
24天前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
33 7
|
22天前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
1月前
|
SQL 测试技术 API
如何编写API接口的自动化测试脚本
本文详细介绍了编写API自动化测试脚本的方法和最佳实践,涵盖确定测试需求、选择测试框架、编写测试脚本(如使用Postman和Python Requests库)、参数化和数据驱动测试、断言和验证、集成CI/CD、生成测试报告及维护更新等内容,旨在帮助开发者构建高效可靠的API测试体系。
|
27天前
|
运维 Devops
自动化运维:从脚本到DevOps的进化之旅
在数字化时代,自动化运维不仅是提高生产效率的关键,更是企业竞争力的象征。本文将带领读者穿越自动化运维的发展历程,从最初的脚本编写到现代DevOps文化的形成,揭示这一演变如何重塑IT行业的工作模式。通过具体案例,我们将展示自动化工具和实践如何简化复杂任务,优化流程,并促进团队协作。你将发现,自动化运维不仅关乎技术的进步,更体现了人、流程和技术三者之间协同增效的深层逻辑。
|
29天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
1月前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
1月前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
1月前
|
存储 监控 前端开发
如何确保测试脚本的稳定性和可靠性?
确保测试脚本的稳定性和可靠性是保证性能测试结果准确有效的关键