Xcode 单元测试

添加单元测试

新建项目时添加

WX20170928-090158

在已有项目中添加

File->New->Target…

WX20170928-090849

效果

WX20170928-090735

基本流程

单元测试的类继承自:XCTestCase

测试方法以test开头

1
2
3
4
5
6
7
8
9
10
11
12
13
override func setUp() {
////每次测试前调用,可以在测试之前创建在test case方法中需要用到的一些对象等
super.setUp()
}
override func tearDown() {
//每次测试结束时调用tearDown方法
super.tearDown()
}
func testExample() {
//具体的测试逻辑
}

基本测试流程:

  • 定义变量和预期
  • 执行方法得到实际值
  • 断言

常用断言表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
//通用断言
XCTAssert(expression, format...)
//常用断言:
XCTAssertTrue(expression, format...)
XCTAssertFalse(expression, format...)
XCTAssertEqual(expression1, expression2, format...)
XCTAssertNotEqual(expression1, expression2, format...)
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNil(expression, format...)
XCTAssertNotNil(expression, format...)
XCTFail(format...) //直接Fail的断言

基本的测试

1
2
3
4
5
6
7
func testExample() {
let a : Int32! = 5
let b : Int32! = 10
let expected: Int32! = 16;
let c:Int32! = self.add(a: a, b: b)
XCTAssertEqual(c, expected, "add方法错误");
}

异步测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func testAsyn() {
let exp : XCTestExpectation = self.expectation(description: "出错啦")
let queue: OperationQueue = OperationQueue.init()
queue.addOperation {
sleep(2)
XCTAssertLessThanOrEqual("1", "1")
exp.fulfill()
}
self .waitForExpectations(timeout: 3, handler: { (error: Error?) in
if error != nil {
print("超时:\(error.debugDescription)")
}
})
}

性能测试

1
2
3
4
5
6
7
8
9
10
11
12
func testPerformanceExample() {
//性能测试方法,通过测试block中方法执行的时间,比对设定的标准值和偏差觉得是否可以通过测试
self.measure {
var i: Int64 = 1
var r: Int64 = 1
while i < 100000000 {
r += i
i+=1
}
print("r=\(r)")
}
}

查看结果&调整期望

演示

代码覆盖率

配置选项:

Product->schemes->edit scheme

WX20170928-091800

代码覆盖是基于文件查看的:新建一个CodeCoverage.swift 提供一个checkName方法。

测试代码:

1
2
3
func testCodeCoverage() {
CodeCoverage.checkName(name: "riverli")
}

查看结果:

WX20170928-092037

基本UI测试

演示