Airtest1.2.7新增的14个断言API解析

发布时间 2023-08-20 18:15:10作者: ☆星空物语☆

以下基于
python3.8;airtestIDE1.2.14;airtest1.2.7;pocoui1.0.87

Airtest1.2.7新增了14个断言API,使得断言更多丰富,之前就有的4个断言:assert_exists、assert_not_exists、assert_equal、assert_not_equal,详细可以看:Airtest API精讲之断言,这里就不再过多介绍。

之前想断言一个变量是不是大于10,可以这样写:

a = 11
assert_equal(a>10, True)

像这次新加了一个assert_greater(),就可以这样写了:

a = 11
assert_greater(a, 10)

其实本质上没有任何区别,只是读代码方式变了,哪种更好用看自己习惯吧,那么下面就来看看具体都是哪14个吧。

新增断言

# __author__ = '测试工程师小站'
# __title__ = '断言测试'

from airtest.core.api import *
from airtest.report.report import simple_report
from airtest.core.assertions import *

auto_setup(__file__, devices=["android:///"], logdir=True)

# 断言参数1为True,成功的情况
assert_true(True, 'assert_true')

# 断言参数1为True,失败的情况
try:
    assert_true(False, 'assert_true')
except:
    pass

# 断言参数1为False,成功的情况
assert_false(False, 'assert_false')

# 断言参数1为False,失败的情况
try:
    assert_false(True, 'assert_false')
except:
    pass

# 断言参数1、参数2内存地址是否一样,成功的情况
assert_is('a', 'a', 'assert_is')

# 断言参数1、参数2内存地址是否一样,失败的情况
try:
    assert_is('a', 'a1', 'assert_is')
except:
    pass

# 断言参数1、参数2内存地址是否不一样,成功的情况
assert_is_not('a', 'a1', 'assert_is_not')

# 断言参数1、参数2内存地址是否不一样,失败的情况
try:
    assert_is_not('a', 'a', 'assert_is_not')
except:
    pass

# 断言参数1为None,成功的情况
assert_is_none(None, 'assert_is_none')

# 断言参数1为None,失败的情况
try:
    assert_is_none('a', 'assert_is_none')
except:
    pass

# 断言参数1不为None,成功的情况
assert_is_not_none('a', 'assert_is_not_none')

# 断言参数1不为None,失败的情况
try:
    assert_is_not_none(None, 'assert_is_not_none')
except:
    pass

# 断言参数1在参数2中,成功的情况
assert_in('a', ['a', 'b'], 'assert_in')

# 断言参数1在参数2中,失败的情况
try:
    assert_in('a', ['a1', 'b'], 'assert_in')
except:
    pass

# 断言参数1不在参数2中,成功的情况
assert_not_in('a', ['a1', 'b'], 'assert_not_in')

# 断言参数1不在参数2中,失败的情况
try:
    assert_not_in('a', ['a', 'b'], 'assert_not_in')
except:
    pass

# 断言参数1是参数2的实例,成功的情况
assert_is_instance(1, int, msg='assert_is_instance')

# 断言参数1是参数2的实例,失败的情况
try:
    assert_is_instance('1', int, msg='assert_is_instance')
except:
    pass

# 断言参数1不是参数2的实例,成功的情况
assert_not_is_instance(1, str, 'assert_not_is_instance')

# 断言参数1不是参数2的实例,失败的情况
try:
    assert_not_is_instance('a', str, 'assert_not_is_instance')
except:
    pass

# 断言参数1>参数2,成功的情况
assert_greater(2, 1, 'assert_greater')

# 断言参数1>参数2,失败的情况
try:
    assert_greater(2, 3, 'assert_greater')
except:
    pass

# 断言参数1>=参数2,成功的情况
assert_greater_equal(2, 2, 'assert_greater_equal')

# 断言参数1>=参数2,失败的情况
try:
    assert_greater_equal(2, 3, 'assert_greater_equal')
except:
    pass

# 断言参数1<参数2,成功的情况
assert_less(0, 1, 'assert_less')

# 断言参数1<参数2,失败的情况
try:
    assert_less(2, 1, 'assert_less')
except:
    pass

# 断言参数1<=参数2,成功的情况
assert_less_equal(1, 1, 'assert_less_equal')

# 断言参数1<=参数2,失败的情况
try:
    assert_less_equal(2, 1, 'assert_less_equal')
except:
    pass

simple_report(__file__)

 

图片

运行之后我们可以看下报告,断言失败时是会终止运行的,但我们上面把失败的断言都try起来了,所以不会中断运行。可以看到报告左边是断言以及msg,右边显示具体的断言内容,以及一张当时的截图。断言加截图我很早就给官方提了建议,算是实现了!

断言是测试中很重要的部分,断言通过的情况下我们可能不太关心,但断言失败的时候,就会非常想知道当时到底是怎样的情况,加一张当时状态的截图是很有必要的,因为App是动态的。比如断言的时候正好其他App或系统弹了个窗,导致运行失败,但弹窗5秒后自动消失了。如果没有截图,我们永久不可能知道当时发生了什么。

断言参数

断言有2个共同的参数,msg和snapshot:

msg是此次断言的描述,默认为空,可以是中文;这个是一定要写的,不然你都不知道这个断言是干嘛的。
snapshot是断言时是否截图,默认为True,不要可以False,强烈建议截图。

上面的例子都写了msg以及截图,你也可以不截图,如

assert_less_equal(1, 1, msg='断言金额是否小于1', snapshot=False)

注意assert_exists是特殊的,它没有snapshot参数!!!
他是通过全局变量ST.SAVE_IMAGE来控制的,默认值是True,即截图,如果不想截图

ST.SAVE_IMAGE = False
assert_exists(Template(r"tpl16657992.png", "想不到有什么情况不截图的"))
ST.SAVE_IMAGE = True  # 如果想后面继续截图,就加这句,想整个脚本都不截图,就不要加

assert_not_exists同上。

但是,但是,ST.SAVE_IMAGE不光控制断言是否截图,所有操作(点击、滑动等)都是这个全局变量控制的,这个一定要注意!
想不通为什么官方不统一给assert_exists、assert_not_exists加上snapshot参数并脱离ST.SAVE_IMAGE的控制。
ST全局变量,详情可以看:Airtest之全局变量

断言API代码文档可看:
https://airtest.readthedocs.io/en/latest/all_module/airtest.core.assertions.html

---------------------------------------------------------------------------------

关注微信公众号即可在手机上查阅,并可接收更多测试分享~