如何编写 UnitTest(单元测试)

这儿每天共享一个 iOS 的新知识,快来重视我吧

单元测验

单元测验是运转和验证一段代码(称为“单元”)的主动化测验,以保证其按预期运转。简直每种语言都支持写单元测验,swift 也不破例,今日主要来讲讲在 iOS 中如何写单元测验。

我了解到国内大部分公司的 iOS 开发人员工作中不写测验,由于他们认为这需求太多时刻,但在面试的过程中又经常被问到有关的问题,所以还是有必要了解一下。

在我看来,虽然单元测验将花不少的时刻,但它的收益也是十分明显的,由于一份好的单元测验能够让代码犯错的概率更低,然后导致你调试和后续的改 bug 的时刻削减。

在 iOS 项目中施行单元测验

咱们从一个新项目开端,创立项目的时分会有一个 Include Tests 的勾选项,需求把它钩上:

如何编写 UnitTest(单元测试)

之后创立出来的项目就主动包含测验的 Target 和相关文件了,这儿会主动创立 UnitTestUITest 两个,咱们本次用到的是 UnitTest

如何编写 UnitTest(单元测试)

假如你是老项目,能够先看下有没有测验 Target,假如没有的话也能够手动来创立,点击 Target 下的加号,选择菜单中的 Unit Testing Bundle 创立即可:

如何编写 UnitTest(单元测试)

如何编写 UnitTest(单元测试)

接下来翻开 TestProjectTests.swift,这是 Xcode 默许创立的测验文件,当然你也能够自己创立。

在这个文件中默许帮咱们创立了几个办法:

override func setUpWithError() throws {
}
override func tearDownWithError() throws {
}
func testExample() throws {
}
func testPerformanceExample() throws {
    measure {
    }
}

setUpWithError 用来设置每个测验办法的初始状态。

tearDownWithError 办法进行最终的一些清理工作。

testExample 是一个默许生成的测验用例。

testPerformanceExample 是一个默许生成的测验函数性能的用例。

单元测验代码

假设咱们有一个计数器的类,主要功能是记录一个从 0 开端的数字,这个类提供加一、减一等操作,大约实现如下:

class Counter {
    var value: Int = 0
    // 加一
    func increment() {
        value += 1
    }
    // 减一
    func decrement() {
        if value > 0 {
            value -= 1
        }
    }
}

接下来咱们为这个类实现单元测验。

由于咱们需求测验主 Target 下的代码,因而先要导入主 Target,需求用到 @testable

@testable import TestProject

然后在 setUpWithErrortearDownWithError 中设置 counter 对象:

final class TestProjectTests: XCTestCase {
    var counter: Counter!
    override func setUpWithError() throws {
        try super.setUpWithError()
        counter = Counter()
    }
    override func tearDownWithError() throws {
        try super.tearDownWithError()
        counter = nil
    }
}

之后就能够开端写测验函数了,首先来测验一下自增函数:

func testIncrement() {
    counter.increment()
    XCTAssertEqual(counter.value, 1)
}

一切的测验用例函数名,都要以 test 开头

XCTAssertEqual 用来比照两个参数是否相等,以验证函数是否符合预期。咱们这儿先调用一下 increment 办法,让计数加 1,然后这时的 value 值应该为 1。

函数编写好之后,在函数名的这一行左面会出现一个菱形按钮:

如何编写 UnitTest(单元测试)

点击它即可开端测验这个函数,假如测验经过,左面按钮会变成绿色:

如何编写 UnitTest(单元测试)

相反,咱们先修改 increment 办法,比方我把它改成每次加 2,再次运转这个测验,测验不经过,左面按钮会变成红色。

如何编写 UnitTest(单元测试)

咱们继续编写测验函数,测验一下自减函数:

func testDecrement() {
    counter.decrement()
    XCTAssertEqual(counter.value, 0)
    counter.increment()
    counter.decrement()
    XCTAssertEqual(counter.value, 0)
}

然后是先加再减:

func testIncrementAndDecrement() {
    counter.increment()
    counter.increment()
    counter.decrement()
    XCTAssertEqual(counter.value, 1)
}

最终能够经过点击 TestProjectTests 左面的菱形来一次执行一切的单元测验

如何编写 UnitTest(单元测试)

理论上来说,你编写的单元测验越多,覆盖率越高,你的代码安全性就越高。

点击下方公众号卡片,重视我,每天共享一个关于 iOS 的新知识

本文同步自微信公众号 “iOS新知”,每天准时共享一个新知识,这儿只是同步,想要及时学到就来重视我吧!