上期回顾:Airtest API精讲之text()
以下基于
python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83
如同所有测试框架都有一个存放全局变量的地方,Airtest也有一个存在全局变量的地方:
# 文件位置:your_python_path/site-packages/airtest/core/settings.py
class Settings(object):
DEBUG = False
LOG_DIR = None
LOG_FILE = "log.txt"
RESIZE_METHOD = staticmethod(cocos_min_strategy)
# keypoint matching: kaze/brisk/akaze/orb, contrib: sift/surf/brief
CVSTRATEGY = ["mstpl", "tpl", "surf", "brisk"]
if LooseVersion(cv2.__version__) > LooseVersion('3.4.2'):
CVSTRATEGY = ["mstpl", "tpl", "sift", "brisk"]
KEYPOINT_MATCHING_PREDICTION = True
THRESHOLD = 0.7 # [0, 1]
THRESHOLD_STRICT = None # dedicated parameter for assert_exists
OPDELAY = 0.1
FIND_TIMEOUT = 20
FIND_TIMEOUT_TMP = 3
PROJECT_ROOT = os.environ.get("PROJECT_ROOT", "") # for ``using`` other script
SNAPSHOT_QUALITY = 10 # 1-100 https://pillow.readthedocs.io/en/5.1.x/handbook/image-file-formats.html#jpeg
# Image compression size, e.g. 1200, means that the size of the screenshot does not exceed 1200*1200
IMAGE_MAXSIZE = os.environ.get("IMAGE_MAXSIZE", None)
SAVE_IMAGE = True
在之前的文章中,已经用过或讲过少部分全局变量,在将来的文章中也会在用到的地方再次陈述。这里我们简单再说下比较典型的:
-
LOG_DIR和LOG_FILE:设置生成LOG的目录和文件名,这个一般情况下我们就用默认的就好了,对Python不熟悉的话自定义设置后可能导致无法生成日志和报告
-
RESIZE_METHOD:分辨率适配规则,用默认的即可。具体原理稍有复杂,引用官网原文:
在使用不同分辨率的设备进行图像识别时,可能会导致识别成功率不佳,因此Airtest提供了默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则)http://docs.cocos.com/creator/manual/zh/ui/multi-resolution.html
想要提高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中用代码实现即可。这样做,能够大大提升不同分辨率设备下的图像识别成功率。
-
CVSTRATEGY:图像匹配时将会使用的识别算法,详情可以看Airtest之3分钟教会你选择合适的图像识别算法
如要使用指定算法,在脚本开头设置
from airtest.core.settings import Settings as ST
ST.CVSTRATEGY = ["mstpl", "tpl"]
-
THRESHOLD:图片识别的阙值。详情可以看之前的文章Airtest-API精讲之Template
-
OPDELAY:操作之间的间隔,保持默认就好。但如果你力求稳定,想让每个操作之前多停一会,可以调大。
-
FIND_TIMEOUT和FIND_TIMEOUT_TMP:在Airtest源码分析--图像识别整体流程中我们讲了,图像识别是在一个指定时间内进行的,超时则认为失败。FIND_TIMEOUT和FIND_TIMEOUT_TMP分别为长、短超时时间。
使用FIND_TIMEOUT的接口有:assert_exists()、touch()、wait()、swipe() 等;
使用FIND_TIMEOUT_TMP的接口有:assert_not_exists()、exists() 等。全局变量是在全局生效的,在一些接口中还可以自定义超时时间,如:
from airtest.core.settings import Settings as ST
# 设置全局的超时时长为60s
ST.FIND_TIMEOUT = 60
ST.FIND_TIMEOUT_TMP = 60
# 设置单条wait语句的超时时长
wait(Template(r"tpl.png", record_pos=(-0.044, -0.177), resolution=(1080, 1920)),timeout=120)
-
PROJECT_ROOT:主要用在使用using()调用其他.air脚本时,using的具体用法可以看Airtest之调用其他脚本——using()如何使用,如:
from airtest.core.settings import Settings as ST
# PROJECT_ROOT需要填写绝对路径
ST.PROJECT_ROOT = "D:/test/user/project"
using("test1.air")
using("test2.air")
# 如不设置项目根目录,我们可能要这么调用test1.air、test2.air
using("D:/test/user/project/test1.air")
using("D:/test/user/project/test2.air")
-
SNAPSHOT_QUALITY和IMAGE_MAXSIZE:分别表示截图精度和截图大小,以用在报告中。Airtest核心API汇总 第12点snapshot中有详细示例
-
SAVE_IMAGE:是否保存脚本运行过程中截图。保存截图会体现在报告中,以图片显示当时的截图以及操作的点位,如:
from airtest.core.api import *
ST.SAVE_IMAGE = False # 关闭截图
touch((100, 100)) # 这条语句将不会保存当前画面图片
ST.SAVE_IMAGE = True # 保存截图
touch((100, 100))
生成报告后,第一个touch将没有截图,第二个touch会显示截图
第一个touch
第二个touch
注意:如果要修改全局变量并使其全局有效,记得一定要放在脚本的开头。
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~