AirtestProject 测试同学都应该知道的断言知识
此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
前言
在编写代码的时候,我们经常会做出一些假设,断言的作用就是在代码中捕捉这些假设。
使用断言的好处有很多,最明显的几点是:
- 可以暴露调用者的错误
- 便于调试
- 对代码没有代价
并且断言在单元测试代码中非常重要,因此我们非常建议在脚本里使用断言语句,来判定被测应用当前的状态是否是我们预期中的状态。
下文将详细讲解在 Airtest 和 Airtest-selenium 中提供的断言接口。
Airtest 的断言语句
验证 UI 界面
Airtest 给我们提供了assert_exists
和assert_not_exists
两个接口,来断言一张图片存在或不存在于当前画面中。
这俩个接口都支持Android
、iOS
和Windows
平台,它们的参数如下:
-
v
– 要检查的目标 -
msg
– 断言的简短描述,它将被记录在报告中
比如,我们以当前设备屏幕上存在天气应用的 icon,来判断当前设备上存在天气应用的 app 为例,就可以写出如下的断言:
assert_exists(Template(r"tpl1578970400453.png", record_pos=(-0.345, 0.142), resolution=(1080, 1920)), "存在天气应用")
此刻的参数v
是一张天气应用的 icon,填写的msg
也会在对应的断言步骤上显示出来。需要注意的是,目前只有 airtest 版本为 1.1.1 时才支持显示断言信息,1.2.2 版本的 IDE 内嵌的 airtest 版本并不是 1.1.1,所以暂不支持显示断言信息。
(该报告用命令行生成,本地 airtest 版本为 1.1.1)
验证数值
同时,airtest 还提供了assert_equal
和assert_not_equal
两个接口,来断言传入的两个值相等或者不相等。
跟上述的俩个接口一样,这俩个接口也支持Android
、iOS
和Windows
平台。它们的参数如下:
-
first
– 第一个值 -
second
– 第二个值 -
msg
– 断言的简短描述,它将被记录在报告中
大多数情况下,这俩个接口用于判断控件的某个属性值与预期值是否相等,例如:
# assert_equal("实际值", "预测值", "请填写测试点.")
# 获取控件的“text”属性值
value = poco("com.miui.calculator:id/btn_8_s").attr("text")
assert_equal(value, "8", "按钮值为8")
如示例代码所示,这里通过 poco 获取了一个控件的 “text” 属性值,然后再通过断言来判断这个属性值是否为 “8”。填写的msg
依旧会显示在报告的断言信息上。
Airtest-selenium 的断言语句
断言图片存在于当前页面
Airtest-Selenium 给我们提供了assert_template()
接口,用于断言目标存在于当前页面中,它包含以下参数:
-
v
- 一个图片对象 -
msg
- 断言的简短描述,它将被记录在报告中
# 断言当前页面存在百度logo这张图片
driver.assert_template(Template(r"tpl1578993813194.png", record_pos=(12.32, 3.915), resolution=(100, 100)), "成功打开百度网页")
断言元素存在
assert_exist()
接口用来断言页面存在某个元素,它的参数与其它断言相比比较特殊:
-
param
- 方法的参数 -
operation
- 查找元素的方法 -
msg
- 断言的简短描述,它将被记录在报告中
# 断言当前页面存在“百度新闻”的页面元素
driver.assert_exist("//a[@href='http://news.baidu.com']", "xpath", "存在百度新闻元素")
示例代码中的参数"xpath"
代表用"xpath"
这个方法来查找页面元素,该元素的"xpath"
属性值为"//a[@href='http://news.baidu.com']"
;同理,还可以用"id"
和"name"
等方法来查找元素。
断言相关的知识
处理断言失败
不论是 airtest 提供的断言接口,还是 Airtest-selenium 提供的断言接口,如果断言失败,都会引发AssertionError
,从而导致脚本执行终止;如果不想脚本因为一个断言失败就终止,可以将断言用 try 语句包起来:
value = poco("com.miui.calculator:id/btn_8_s").attr("text")
try:
assert_equal(value, "8", "按钮值为8")
except AssertionError:
print("按钮值断言失败")
poco("com.miui.calculator:id/btn_9_s").click()
这样即使断言失败,后面的 poco 点击语句还是会正常执行:
否则断言失败时,脚本会直接报错,终止运行:
assert_exists 接口的超时时间和阙值
assert_exists
和assert_not_exists
这两个接口是用来验证某个图片是否存在于当前设备屏幕上,在查找图片时,它们会有一个超时时间和阙值:
从源码中可以得知,这俩接口查找图片的超时时间和阙值都是全局变量,timeout
为 20s,threasold
为 0.7,所以脚本只有在 20s 内找到置信度>0.7 的结果,断言才会成功。
如果想要修改这俩个接口查找图片的超时时间和阙值,把对应俩个全局变量的值修改即可。