AirtestProject 最全 Airtest 接口功能介绍和示例总结,新手同学千万不能错过呀!(二)

fishfish-yu · 2020年12月09日 · 2343 次阅读

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

在上一期的 Airtest 接口功能介绍和示例总结 的推文中,我们给大家汇总了以下 4 个方面的 API 功能与示例:

  • 1.脚本初始化接口
  • 2.设备连接与使用相关的接口
  • 3.操作应用相关的接口
  • 4.常用的模拟操作

这周,我们把 Airtest 剩余的 API 和设置讲解完:

  • 5.断言相关的接口
  • 6.log 记录和报告生成相关的接口
  • 7.Airtest 的一些全局设置

5.断言相关的接口

1)断言存在:assert_exists()

设备屏幕上存在断言目标,需要传入 1 个断言目标(截图)和在报告上显示的断言步骤信息,示例:

assert_exists(Template(r"tpl1607324047907.png", record_pos=(-0.382, 0.359), resolution=(1080, 1920)), "找到首页的天猫入口")

运行完脚本之后,Airtest 报告的断言步骤会显示我们自定义的信息:

接口的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html#airtest.core.api.assert_exists

2)断言不存在:assert_not_exists()

设备屏幕上不存在断言目标,与 assert_exists() 一样,需要传入 1 个断言目标(截图)和在报告上显示的断言步骤信息,示例:

assert_not_exists(Template(r"tpl1607325103087.png", record_pos=(-0.005, 0.356), resolution=(1080, 1920)), "当前页不存在天猫国际的icon")

接口的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html#airtest.core.api.assert_not_exists

3)断言相等:assert_equal()

断言两个值相等,需要传入 2 个断言的值,还有将被记录在报告中的断言的简短描述:

assert_equal("实际值", "预测值", "请填写断言的简短描述")

常与 poco 获取属性的脚本一起做断言,示例如下:

assert_equal(poco("com.taobao.taobao:id/dx_root").get_text(), "天猫新品", "控件的text属性值为天猫新品")

assert_equal(str(poco(text="天猫新品").attr("enabled")), "True", "控件的enabled属性值为True")

接口的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html#airtest.core.api.assert_equal

4)断言不相等:assert_not_equal()

断言两个值不相等,与 assert_equal() 一样,需要传入 2 个断言的值,还有将被记录在报告中的断言的简短描述:

assert_not_equal("实际值", "预测值", "请填写断言的简短描述")

assert_not_equal("1", "2", "断言1和2不相等")

接口的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html#airtest.core.api.assert_not_equal

PS:如果断言失败,会引起 AssertionError ,并且导致脚本停止运行,如需断言失败还继续运行脚本,同学们可以使用 try-except 等语句捕捉 AssertionError

更多断言的教程推荐查看我们的往期推文:测试同学都应该知道的断言知识...

6.log 记录和报告生成相关的接口

1)log 记录:log()

log() 接口方便插入用户自定义的一些 log 信息,将会被显示在 Airtest 报告中。在 1.1.6 版本的 Airtest 中,log 接口支持传入 4 个参数:

  • args ,可以是字符串、非字符串或者 traceback 对象;
  • timestamp ,用于自定义当前 log 的时间戳;
  • desc ,用于自定义 log 的标题;
  • snapshot ,表示是否需要截取一张当前的屏幕图像并显示到报告中:

示例如下:

# 传入字符串
log("123",desc="这是标题01")

# 传入非字符串
data = {"test": 123, "time": 123456}
log(data,desc="这是标题02")

# 传入traceback
try:
    1/0
except Exception as e:
    log(e, desc="这是标题03")

注意,如果不传入 timestamp 的话,默认记录当前时间:

# 记录timestamp,并且对当前画面截图
log("123", timestamp=time.time(), desc="这是标题04", snapshot=True)

接口的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.helper.html?highlight=log#airtest.core.helper.log

2)报告生成:simple_report()

生成报告的简单接口,用户只需要在脚本中调用这个接口,然后传入几个必要的报告参数,就能够在脚本运行完毕之后,按照要求自动生成 Airtest 报告:

simple_report(filepath, logpath=True, logfile='log.txt', output='log.html')

其中可传入的 4 个参数分别表示:

  • filepath,脚本文件的路径,可以直接传入变量 __file__
  • logpath ,log 内容所在路径,如为 True ,则默认去当前脚本所在路径找 log 内容
  • logfile ,log.txt 的文件路径
  • output ,报告的到处路径,必须以 .html 结尾

示例如下:

from airtest.report.report import simple_report
auto_setup(__file__, logdir=True)

# 此处省略N条用例脚本

simple_report(__file__,logpath=True,logfile=r"D:\test\1234.air\log\log.txt",output=r"D:\test\1234.air\log\log1234.html")

另外需要注意的是,我们要在用例脚本之后调用这个生成报告的接口,如在脚本开头调用,则意味着还没有运行后面的用例步骤,就已经生成了一份报告,最终不论我们脚本运行情况如何,我们都只能拿到一份空的测试报告。

接口的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.report.report.html#airtest.report.report.simple_report

3)报告生成:logtohtml()

报告的基类,实际上我们刚才介绍的 simple_report 也是用这个类实现的,只不过 simple_report 的参数更少,用法更加简单:

class LogToHtml(script_root, log_root='', static_root='', export_dir=None, script_name='', logfile='log.txt', lang='en', plugins=None)

可以看到, logtohtml 类可以传入的参数非常多,用法相对复杂一些:

  • script_root ,脚本路径
  • log_root ,log 文件的路径
  • static_root ,部署静态资源的服务器路径
  • export_dir ,导出报告的存放路径
  • script_name ,脚本名称
  • logfile ,log 文件 log.txt 的路径
  • lang ,报告的语言(中文:zh;英文:en)
  • plugins ,插件,使用了 poco 或者 airtest-selenium 会用到

使用 logtohtml 生成测试报告时,我们一般先实例化一个 logtohtml 对象,然后用这个对象调用类方法 report() 生成报告,示例如下:

from airtest.report.report import LogToHtml

# 此处省略N条用例脚本

h1 = LogToHtml(script_root=r'D:\test\1234.air', log_root=r"D:\test\1234.air\log", export_dir=r"D:\test\1234.air" ,logfile=r'D:\test\1234.air\log\log.txt', lang='en', plugins=["poco.utils.airtest.report"])
h1.report()

LogToHtml 类的 API 文档链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.report.report.html#airtest.report.report.LogToHtml

PS:如需查看命令行生成报告和使用脚本生成报告的详细教程,推荐阅读文章 Airtest 报告 “全攻略”,看完直接用脚本生成、导出报告,真香!

7.Airtest 的一些全局设置

Airtest 的设置模块详见文档:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.settings.html?highlight=settings#airtest.core.settings.Settings

1)log 内容的设置:LOGFILE、LOGDIR

LOGFILE 用于自定义记录 log 内容的 txt 文档的名称;LOGDIR 用于自定义 log 内容的保存路径,示例如下:

from airtest.core.settings import Settings as ST
from airtest.core.helper import set_logdir

ST.LOG_FILE = "log123.txt"
set_logdir(r'D:\test\1234.air\logs')

auto_setup(__file__)

# 此处省略N条用例脚本

2)图像识别算法的设置:CVSTRATEGY

CVSTRATEGY 用于设置 Airtest 的图像识别算法,默认情况下 CVSTRATEGY = ["surf", "tpl", "brisk"] ,每次查找图片的时候,airtest 就会按照这个设置好的算法顺序去执行,直到找出一个符合设定阈值的识别结果,或者是一直按照这个算法顺序循环查找,直到超时。

我们可以自定义 Airtest 的图像识别算法,示例如下:

from airtest.core.settings import Settings as ST

ST.CVSTRATEGY = ["tpl", "sift","brisk"]

PS:关于 Airtest 各个图像识别算法的介绍,推荐阅读文章3 分钟教会你选择合适的图像识别算法

3)图像阙值:THRESHOLD、THRESHOLD_STRICT

THRESHOLDTHRESHOLD_STRICT 都是图像识别的阙值,Airtest1.1.6 版本之后,所有用到了图像识别的接口,都是用 THRESHOLD 作为阙值。它的默认值为 0.7,取值范围 [0,1]。

在进行图像匹配时,只有当识别结果的可信度大于阙值时,才认为找到了匹配的结果:

除了可以修改全局的图像识别阙值,我们还支持修改单张图片的阙值,需要注意的是,如我们没有单独设置图像的阙值,将默认使用全局阙值 THRESHOLD ,示例如下:

from airtest.core.settings import Settings as ST

# 设置全局阙值为0.8
ST.THRESHOLD = 0.8

# 设置单张图片的阙值为0.9
touch(Template(r"tpl1607424190850.png", threshold=0.9, record_pos=(-0.394, -0.176), resolution=(1080, 1920)))

在 Airtest1.1.6 之前, assert_exists 使用的图像阙值 是 THRESHOLD_STRICT 。所以使用 1.1.6 之前版本的同学,想要修改 assert_exists 的图像阙值,需要设置 THRESHOLD_STRICT 的值。

4)查询的超时时长:FIND_TIMEOUT、FIND_TIMEOUT_TMP

上面我们提到,在进行图像匹配时,会循环用几个算法去识别,但是循环识别并不是无限的,这里有一个查询的超时时长设置,一旦查询时间大于超时时长,还是未找到可信度大于阙值的结果,那就认定此次匹配失败,默认的超时时长如下:

FIND_TIMEOUT = 20
FIND_TIMEOUT_TMP = 3

使用 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"tpl1607425650104.png", record_pos=(-0.044, -0.177), resolution=(1080, 1920)),timeout=120)
5)项目根目录:PROJECT_ROOT

项目根目录常用于调用其它 .air 脚本时,示例如下:

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")

另外,上节课我们介绍的 auto_setup() 接口也可以传入项目根目录:

auto_setup(__file__, project_root="D:/test/user/project")
6)截图压缩精度:SNAPSHOT_QUALITY

SNAPSHOT_QUALITY 用于设置全局的截图压缩精度,需要注意的是,设置的是 Airtest 报告里面显示的截图精度,而不是我们的截图脚本截取的那张图片的精度。默认值为 10,取值范围 [1,100],数值越高,截图的精度越高,越清晰。示例如下:

from airtest.core.settings import Settings as ST

# 设置全局的截图精度为90
ST.SNAPSHOT_QUALITY = 90

另外我们还可以定义单张截图的压缩精度,示例:

# 设置单张截图的压缩精度为90,其余未设置的将按照全局压缩精度来
snapshot(quality=90)
7)截图尺寸大小:IMAGE_MAXSIZE

在 Airtest1.1.6 中,新增了一个用于指定截图最大尺寸的设置:ST.IMAGE_MAXSIZE 。假如设置为 1200,则最后保存的截图长宽都不会超过 1200,有利于进一步缩小截图的图片尺寸。示例:

from airtest.core.settings import Settings as ST

# 设置全局截图尺寸不超过600*600,如果不设置,默认为原图尺寸
ST.IMAGE_MAXSIZE = 600

# 不单独设置的情况下,默认采用ST中的全局变量的数值,即600*600
snapshot(msg="test12")
# 设置单张截图的最大尺寸不超过1200*1200
snapshot(filename="test2.png", msg="test02", quality=90, max_size=1200) 

Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b

官方答疑 Q 群:654700783

呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~

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