Xctest 是iOS的單元測試框架,有objective-c和swift兩種語言可以選擇
Xcuitest 是iOS的UI測試框架
XCTest 官方文檔地址:
https://developer.apple.com/documentation/xctest
XCTest 框架類似於python中的unit test框架,聲明一個測試case繼承XCTestCase和測試方法,測試方法以test開頭,然后執行。
相關類介紹:
Class XCTest
XCTest類提供XCTestCase和XCTestSuite用於創建、管理和執行測試的共享功能。在大多數情況下,在項目中定義測試時,應該直接子類化XCTestCase。
包含了以下屬性:
- name: test 的 name
- testCaseCount: case個數
- testRun: XCTestRun對象來執行test
- testRunClass: 運行測試時實例化的XCTestRun子類,以保存測試結果。
包含了以下方法:
- perform( XCTestRun ): 執行一個特定的測試
- run():創建testRunClass指定的類的實例,並將其作為參數傳遞給執行perform(_:)方法。
還包含了一系列的斷言方法
Class XCTestCase
具體的屬性和方法看文檔,主要包含代碼塊性能檢測,異步測試(例如打開文檔,其它線程工作,網絡活動等等)
然后我們看下iOS比較特殊的XCUITest
Class XCUITest
Xcuitest 的話有三大類
XCUIApplication: 實現了application的launch,active, terminal, state等功能
XCUIElement:定義了元素的操作事件
XCUIElementQuery: 元素查詢定位相關
XCUIApplication類繼承自XCUIElement類,XCUIElement類遵循XCUIElementAttributes和XCUIElementTypeQueryProvider協議,而XCUIElementTypeQueryProvider協議返回的UI元素對象則是XCUIElementQuery類。
XCUIApplication
有三種創建application的方法
- init()會創建當前test的target application 代理,這個是在Xcode中設置的
- init(bundleIdentifier)創建指定bundle ID的application 代理
- init(url) 根據URL指定資源創建代理
幾個常用的方法:
- launch( ) 啟動app
- activate() 激活app(如果app進入后台,可以用這個方法激活啟動到前台)
- terminate() 終止所有app
XCUIApplication.State
判斷當前app的運行狀態
- unknown 未知狀態
- notRuning 未運行
- runningBackgroundSubspended 后台運行但被掛起
- runningBackground 后台運行
- runningForeground 正在前台運行
XCUIElement
XCUIElementQuery
Xcuielement 是所有app元素的類,重點記錄下如何使用XCUIElementQuery來定位元素
創建查詢
返回所有符合元素類型的結果
func containing(_ predicate:
NSPredicate) ->
XCUIElementQuery
返回包含匹配特定描述的元素
func matching(identifier:
String) ->
XCUIElementQuery
返回匹配identifier的所有元素
func matching(NSPredicate) ->
XCUIElementQuery
傳入NSPredicate作為過濾器返回一個新查詢,該查詢匹配與所提供描述直接匹配的所有元素。
獲取匹配元素
var allElementsBoundByIndex: [
XCUIElement] { get }
查詢返回對應索引的元素數組
var count:
Int { get }
查詢匹配到的元素個數
var element:
XCUIElement { get }
查詢的單個匹配元素
func element(boundBy index:
Int) ->
XCUIElement
將索引用於查詢結果的元素,以確定要使用哪個基礎可訪問性元素。
func element(matching predicate:
NSPredicate) ->
XCUIElement
返回與之匹配的元素
這里要介紹下Class NSPredicate
一種邏輯條件的定義,用於約束檢索或內存篩選。
init(format predicateFormat:
String,
argumentArray arguments: [Any]?)
通過將給定數組中的值替換為格式字符串並解析結果來初始化匹配器。
例如:
//創建匹配器,匹配placeholderValue的值為Type in number的控件
let predicate = NSPredicate(format: "placeholderValue == %@", "Type in number")
Class XCUICoordinate
屏幕上相對於某個UI元素的位置。
可以通過xcuielement的
func coordinate(withNormalizedOffset normalizedOffset:
CGVector) ->
XCUICoordinate
來生成一個UI位置
這個點生成的參數CGVector是生成位置的x,y除以當前element的中心點的x,y坐標
在官方文檔中還有許多類,但基本基於上述的一些父類實現不同的方法,這個需要根據測試的需要來使用