前言
在上一期的 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報告的斷言步驟會顯示我們自定義的信息:
2)斷言不存在:assert_not_exists()
設備屏幕上不存在斷言目標,與 assert_exists() 一樣,需要傳入1個斷言目標(截圖)和在報告上顯示的斷言步驟信息,示例:
assert_not_exists(Template(r"tpl1607325103087.png", record_pos=(-0.005, 0.356), resolution=(1080, 1920)), "當前頁不存在天貓國際的icon")
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")
4)斷言不相等:assert_not_equal()
斷言兩個值不相等,與 assert_equal() 一樣,需要傳入2個斷言的值,還有將被記錄在報告中的斷言的簡短描述:
assert_not_equal("實際值", "預測值", "請填寫斷言的簡短描述") assert_not_equal("1", "2", "斷言1和2不相等")
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)
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")
另外需要注意的是,我們要在用例腳本之后調用這個生成報告的接口,如在腳本開頭調用,則意味着還沒有運行后面的用例步驟,就已經生成了一份報告,最終不論我們腳本運行情況如何,我們都只能拿到一份空的測試報告。
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
THRESHOLD 和 THRESHOLD_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)
AirtestProject官方答疑Q群:654700783
Airtest官網:http://airtest.netease.com/
Airtest教程官網:https://airtest.doc.io.netease.com/
搭建企業私有雲服務:https://airlab.163.com/b2b
呀,這么認真都看到這里啦,幫忙點個推薦支持一下唄,灰常感謝~
