iOS测试

iOS测试

UNIT TESTS VS UI TESTS

  • Unit tests — test small, units of code
  • UI Tests — test user interface

测试类是XCTestCase的子类,包含多个测试方法,测试方法必须以test开头

setup()方法每次测试前调用,可以在测试之前创建在test case方法中需要用到的一些对象等
tearDown()方法每次测试结束时调用tearDown方法

@testable import XXXX引入主工程时加上@testable关键字作为前缀,现在即可在测试类中引入任何主工程中的internal类了,参考Swift 2 中的单元测试关键字 @testable

方法调用的过程是:setup()->测试方法->tearDown(),如果还有另外的测试方法,就再循环调动,即setup()tearDown()对每个测试方法都要调用

怎么写有用的测试方法呢?
1.测试有fail的可能性
2.测试有pass的可能性
3.代码要重构,并保持简洁

测试之前,先添加一个target,如下选择UnitTest
创建target

自己创建测试类时,选择Unit Test Case Class

Unit Test Case Class

断言
参考iOS单元测试
大部分的测试方法使用断言决定的测试结果。所有断言都有一个类似的形式:比较,表达式为真假,强行失败等

//通用断言
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的断言

运行测试
Command+U运行测试

每个单元测试可被分为3个基本的section: given, when, then

  • Given is the initial state or setup before the test can be performed测试之前的初始化状态或设置
  • When is the action or behavior that’s being tested被测试的动作或行为
  • Then is verification that the expected behavior occurred or value was returned确认预期的行为或返回的值

如:

func testFirstPancakeHouseHasExpectedValues() {
    // given
    collection = PancakeHouseCollection()
    // when
    let bundle = Bundle(for: PancakeHouseCollectionTests.self)
    collection.loadPancakeHouses("test_pancake_houses",
    in: bundle)
    // then
    let pancakeHouse = collection[0]
    XCTAssertEqual(pancakeHouse.name, "name 1")
    XCTAssertEqual(pancakeHouse.details, "details 1")
    XCTAssertEqual(pancakeHouse.photo,
    UIImage(named: "pancake\(plistIndex)"))
}

Expectation
上面的测试代码都是从上到下依次执行,但如果有异步调用,该怎么办呢?
就要使用Expectation,然后等待Expectation被fufilled,可设置最大等待的时间,如果在最大等待的时间里没有被fulfilled,test就被标记为失败了。

这里写图片描述

Mock测试
参考:

什么是mock测试?
对于一些不容易构造或不容易获取的对象,此时你可以创建一个虚拟的对象(mock object)来完成测试。

其它资源

每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。