如何编写 UnitTest(单元测试)

这里每天分享一个 iOS 的新知识,快来关注我吧

单元测试

单元测试是运行和验证一段代码(称为"单元")的自动化测试,以确保其按预期运行。几乎每种语言都支持写单元测试,swift 也不例外,今天主要来讲讲在 iOS 中如何写单元测试。

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

在我看来,虽然单元测试将花不少的时间,但它的收益也是非常明显的,因为一份好的单元测试能够让代码出错的概率更低,从而导致你调试和后续的改 bug 的时间减少。

在 iOS 项目中实施单元测试

我们从一个新项目开始,创建项目的时候会有一个 Include Tests 的勾选项,需要把它钩上:

之后创建出来的项目就自动包含测试的 Target 和相关文件了,这里会自动创建 UnitTestUITest 两个,我们本次用到的是 UnitTest

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

接下来打开 TestProjectTests.swift,这是 Xcode 默认创建的测试文件,当然你也可以自己创建。

在这个文件中默认帮我们创建了几个方法:

swift 复制代码
override func setUpWithError() throws {
}

override func tearDownWithError() throws {
}

func testExample() throws {
}

func testPerformanceExample() throws {
    measure {
    }
}

setUpWithError 用来设置每个测试方法的初始状态。

tearDownWithError 方法进行最后的一些清理工作。

testExample 是一个默认生成的测试用例。

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

单元测试代码

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

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

接下来我们为这个类实现单元测试。

因为我们需要测试主 Target 下的代码,因此先要导入主 Target,需要用到 @testable

java 复制代码
@testable import TestProject

然后在 setUpWithErrortearDownWithError 中设置 counter 对象:

swift 复制代码
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
    }
}

之后就可以开始写测试函数了,首先来测试一下自增函数:

scss 复制代码
func testIncrement() {
    counter.increment()
    XCTAssertEqual(counter.value, 1)
}

所有的测试用例函数名,都要以 test 开头

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

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

点击它即可开始测试这个函数,如果测试通过,左侧按钮会变成绿色:

相反,我们先修改 increment 方法,比如我把它改成每次加 2,再次运行这个测试,测试不通过,左侧按钮会变成红色。

我们继续编写测试函数,测试一下自减函数:

scss 复制代码
func testDecrement() {
    counter.decrement()
    XCTAssertEqual(counter.value, 0)
    
    counter.increment()
    counter.decrement()
    XCTAssertEqual(counter.value, 0)
}

然后是先加再减:

scss 复制代码
func testIncrementAndDecrement() {
    counter.increment()
    counter.increment()
    counter.decrement()
    XCTAssertEqual(counter.value, 1)
}

最后可以通过点击 TestProjectTests 左边的菱形来一次执行所有的单元测试

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

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

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
2501_915909066 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者86 小时前
TraceEagle 代理抓包详解,无感代理、去证书绑定与 HTTP/3 解密能力解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
aiopencode7 小时前
SwiftUI Introspect生产环境完全指南:为什么它是安全可靠的选择
后端·ios
for_ever_love__8 小时前
iOS: 网络管理单例
学习·ios·objective-c
00后程序员张9 小时前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
ii_best18 小时前
更新!移动端开发软件按键安卓版&手机助手v5.1.0上线!本地AI识别全面解锁,脚本开发再升级
android·人工智能·ios·按键精灵
weixin_403810131 天前
03-iOS免越狱无线投屏-上传图片和视频到相册
ios·新媒体运营·跨境电商·ios自动化·ios投屏·ios智能体·ios脚本
2501_916007471 天前
SwiftUI 声明式语法与 Xcode 预览功能详解
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
大龄秃头程序员1 天前
Swift Concurrency 取消机制踩坑复盘:为什么很多人会误以为 Task 根本取消不了?
swift
2501_916008891 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone