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坐标
在官方文档中还有许多类,但基本基于上述的一些父类实现不同的方法,这个需要根据测试的需要来使用