这儿每天共享一个 iOS 的新知识,快来重视我吧
单元测验
单元测验是运转和验证一段代码(称为“单元”)的主动化测验,以保证其按预期运转。简直每种语言都支持写单元测验,swift 也不破例,今日主要来讲讲在 iOS 中如何写单元测验。
我了解到国内大部分公司的 iOS 开发人员工作中不写测验,由于他们认为这需求太多时刻,但在面试的过程中又经常被问到有关的问题,所以还是有必要了解一下。
在我看来,虽然单元测验将花不少的时刻,但它的收益也是十分明显的,由于一份好的单元测验能够让代码犯错的概率更低,然后导致你调试和后续的改 bug 的时刻削减。
在 iOS 项目中施行单元测验
咱们从一个新项目开端,创立项目的时分会有一个 Include Tests
的勾选项,需求把它钩上:
之后创立出来的项目就主动包含测验的 Target
和相关文件了,这儿会主动创立 UnitTest
和 UITest
两个,咱们本次用到的是 UnitTest
:
假如你是老项目,能够先看下有没有测验 Target
,假如没有的话也能够手动来创立,点击 Target
下的加号,选择菜单中的 Unit Testing Bundle
创立即可:
接下来翻开 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
然后在 setUpWithError
和 tearDownWithError
中设置 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。
函数编写好之后,在函数名的这一行左面会出现一个菱形按钮:
点击它即可开端测验这个函数,假如测验经过,左面按钮会变成绿色:
相反,咱们先修改 increment
办法,比方我把它改成每次加 2,再次运转这个测验,测验不经过,左面按钮会变成红色。
咱们继续编写测验函数,测验一下自减函数:
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
左面的菱形来一次执行一切的单元测验
理论上来说,你编写的单元测验越多,覆盖率越高,你的代码安全性就越高。
点击下方公众号卡片,重视我,每天共享一个关于 iOS 的新知识
本文同步自微信公众号 “iOS新知”,每天准时共享一个新知识,这儿只是同步,想要及时学到就来重视我吧!