iOS测试

来源:互联网 发布:淘宝商城休闲女鞋 编辑:程序博客网 时间:2024/05/21 17:53

iOS测试

UNIT TESTS VS UI TESTS

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

Unit Test

测试类是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测试
参考:

  • iOS中的测试:OCMock

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

Performance Test
性能测试主要使用 measureBlock 方法 ,用于测试一组方法的执行时间,通过设置baseline(基准)和stddev(标准偏差)来判断方法是否能通过性能测试。

    func testMeasuerLoadDefaultPancakeHouses()    {        measure {            self.collection.loadDefaultPancakeHouses()        }    }

Enable Code Coverage
Code Coverage可用来测量有多少代码执行了测试
这里写图片描述

UI Test

Proxy类
Proxy类

XCUIDevice-表示的device,可用来设置device的方向,或者模拟如按音量键的行为
XCUIApplication-表示app,至少要创建一个这个类的实例,用来加载app并测试,XCUIApplication其实是XCUIElement的一个子类
XCUIElement-表示所以可测试的单元,如tableview,cell等,也包括一些Action方法:

  • type text, tap, swipe up等

一些属性Properties,如下:

  • frame, title, enabled, exists等

如下的UI测试:

    func testCanNavigateToAboutScreen()    {        //查找到对应的按钮,并点击        let pancakeHouseButton = app.navigationBars.buttons["Pancake Houses"]        pancakeHouseButton.tap()        let aboutButton = app.navigationBars.buttons["About"]        aboutButton.tap()        let aboutTitleText = app.navigationBars.staticTexts["About"]        XCTAssertTrue(aboutTitleText.exists, "should be on the about screen")    }

XCUIElementQuery在UI层级中搜素对应的UI元素

这里写图片描述

Recording UI Test
除了自己写UI Test之外,还有另外一种方式,运行app,和它交互,然后Xcode可以记录所有的action,并把它们转化为代码

这里写图片描述

TDD

参考TDD的iOS开发初步以及Kiwi使用入门

其它资源

  • Testing with Xcode
  • iOS单元测试
原创粉丝点击