[Swift]单元测试

这篇具有很好参考价值的文章主要介绍了[Swift]单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编写单元测试是确保你的代码质量和功能正确性的重要步骤

一、编写单元测试的详细流程

1. 创建一个新的Xcode项目

如果你尚未创建一个项目,首先你需要在Xcode中创建一个新的iOS项目:

  • 打开Xcode,选择“File” > “New” > “Project”。

  • 选择一个适合的项目模板,例如“App”,然后点击“Next”。

  • 填写项目的详细信息(如项目名称、团队、组织名称和语言选择Swift),确保勾选“Include Tests”选项,然后点击创建。

[Swift]单元测试,Swift,单元测试

2. 理解测试目标和框架

创建项目时,如果你选择了“Include Tests”,Xcode会自动为你的项目生成一个测试目标(Target)。这个测试目标使用XCTest框架,这是Apple提供的用于编写单元测试的框架。

[Swift]单元测试,Swift,单元测试

3. 编写测试用例

单元测试通常是围绕你的应用程序的单一功能或类来编写的。

下面是编写单元测试的基本步骤:

(1).找到测试文件

在Xcode的项目导航器中,找到以“Tests”结尾的目标文件夹。默认的测试文件可能类似于YourProjectNameTests.swift。

(2).导入测试模块

在测试文件的顶部,确保导入了XCTest框架和你的主项目模块。例如:

import XCTest
@testable import YourProjectName

(3).创建测试类

Xcode默认创建的测试类继承自XCTestCase。你可以在这个类中添加测试方法。

(4).编写测试方法

每个测试方法都必须以test开头。方法内部使用断言来验证代码的功能。例如,测试一个简单的加法函数:

func testAddition() {
    let result = Calculator.add(1, 2)
    XCTAssertEqual(result, 3, "The addition function failed.")
}

这里,XCTAssertEqual是一个断言,用于检查Calculator.add(1, 2)的结果是否等于3。

(5).默认生成的代码

一般上面几步不用手动敲代码,YourProjectNameTests.swift文件中会包含如下代码,XCTestCase类提供了多个方法来帮助设置、执行和拆分测试。

import XCTest
@testable import GameDeDemo

final class GameDeDemoTests: XCTestCase {

    /**
     将设置代码放在这里。此方法在类中的每个测试方法调用之前被调用。
     
     用途:这个方法在每个测试方法之前被调用。它用于设置测试环境,确保每个测试都在干净且已知的状态下开始。
     例子:在这个方法中,你可以初始化一些对象,设置或重置模拟数据,或配置环境(如数据库连接、网络环境等)。
     */
    override func setUpWithError() throws {

    }

    /**
     把拆卸代码放在这里。在调用类中的每个测试方法之后调用此方法。
     
     用途:这个方法在每个测试方法之后被调用。它用于清理或拆分测试后的环境,确保一个测试的执行不会影响到其他测试。
     例子:释放在setUpWithError()中创建的对象,关闭数据库连接,清理模拟数据等。
     */
    override func tearDownWithError() throws {

    }

    /**
     这是一个功能测试用例。
     使用XCTAssert和相关函数来验证测试是否产生正确的结果。
     
     为XCTest编写的任何测试都可以被注释为抛出和async。
     当测试遇到未捕获的错误时,标记测试抛出以产生意外失败。
     将测试标记为async,允许等待异步代码完成。之后用断言检查结果。
     */
    func testExample() throws {

    }
    

    /**
     用途:这个方法用于性能测试,主要用来测量一段代码的执行时间。通过measure方法,Xcode会多次执行代码块,并记录执行时间,从而帮助开发者了解代码的性能。
     例子:测量一个复杂算法的执行时间,或者评估一个数据处理函数的性能。
     */
    func testPerformanceExample() throws {
        // 这是一个性能测试用例的示例。
        self.measure {
            // 把要测量时间的代码写在这里。
        }
    }

}

4. 运行测试

(1).使用快捷键

可以直接在Xcode中使用快捷键Command + U来运行所有测试。

[Swift]单元测试,Swift,单元测试

(2).切换运行按钮

长按运行按钮,切换到Build for Testing,后面点击运行就是运行所有测试。

[Swift]单元测试,Swift,单元测试

(3).使用测试导航器

在Xcode的侧边栏中,切换到测试导航器(测试图标),然后可以单独运行某个测试类或测试方法。

[Swift]单元测试,Swift,单元测试

(4).单元测试文件运行

文件中,选择方法前面的“开始”,就是重新运行某个方法。选择文件名前面的“开始”,就是重新运行某个类。

[Swift]单元测试,Swift,单元测试

5. 查看测试结果

测试完成后,Xcode会在编辑器左侧的测试导航器中显示测试结果。成功的测试会标记为绿色勾选,失败的测试会标记为红色叉号。如果测试失败,可以查看失败原因,并根据失败信息调整代码或测试逻辑。

[Swift]单元测试,Swift,单元测试

除此之外,调试面板还会打印详细日志。 会展示每个方法执行时间,整个文件所执行的时间,以及报错信息。

Test Suite 'GameDeDemoTests' started at 2024-04-24 23:08:55.753.

Test Case '-[GameDeDemoTests.GameDeDemoTests testExample1]' started.
/Users/gamin/Desktop/GameDeDemo/GameDeDemoTests/GameDeDemoTests.swift:53: error: -[GameDeDemoTests.GameDeDemoTests testExample1] : XCTAssertTrue failed - Result should be true
Test Case '-[GameDeDemoTests.GameDeDemoTests testExample1]' failed (0.023 seconds).

Test Case '-[GameDeDemoTests.GameDeDemoTests testExample]' started.
Test Case '-[GameDeDemoTests.GameDeDemoTests testExample]' passed (0.002 seconds).

Test Case '-[GameDeDemoTests.GameDeDemoTests testOneExample]' started.
Test Case '-[GameDeDemoTests.GameDeDemoTests testOneExample]' passed (1.351 seconds).

Test Case '-[GameDeDemoTests.GameDeDemoTests testPerformanceExample]' started.
/Users/gamin/Desktop/GameDeDemo/GameDeDemoTests/GameDeDemoTests.swift:62: Test Case '-[GameDeDemoTests.GameDeDemoTests testPerformanceExample]' measured [Time, seconds] average: 0.000, relative standard deviation: 179.574%, values: [0.000083, 0.000009, 0.000006, 0.000005, 0.000005, 0.000005, 0.000004, 0.000004, 0.000005, 0.000004], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
Test Case '-[GameDeDemoTests.GameDeDemoTests testPerformanceExample]' passed (0.258 seconds).

Test Suite 'GameDeDemoTests' failed at 2024-04-24 23:08:57.389.
	 Executed 4 tests, with 1 failure (0 unexpected) in 1.634 (1.636) seconds

6. 重构和维护测试

随着项目的发展,持续维护和更新单元测试是非常重要的。确保在添加新功能或修改现有代码后更新相应的测试,以保持测试覆盖率和代码质量。

二、如何组织单元测试代码?

在进行单元测试时,组织和结构化测试代码是非常重要的。虽然技术上可以将所有测试写入一个单一的测试类中,但这通常不是最佳实践。

以下是一些关于如何组织单元测试代码的建议和优点:

1.分开测试文件的理由

(1).可维护性

将测试分散到不同的文件中可以提高代码的可维护性。当测试文件专注于特定的功能模块时,相关的测试更容易查找和更新。

(2).可读性

小型、专注的测试文件比一个庞大的测试文件更易于阅读和理解。每个测试类可以对应于应用程序中的一个模块或类,这样代码结构会更清晰。

(3).避免冲突

在团队环境中,多个开发者可能同时工作在不同的模块上。分开测试文件可以减少版本控制中的合并冲突。

(4).并行测试

当测试被组织到多个文件中时,运行测试的工具(如Xcode)可能能更有效地并行执行这些测试,从而减少总的测试时间。

2.如何组织测试?

(1).按类或模块组织

对于每个主要的类或功能模块,都应该有一个对应的测试类。例如,如果你有一个Game类和一个Player类,你可以创建GameTests.swiftPlayerTests.swift

(2).遵守命名约定

保持一致的命名约定有助于团队成员快速理解测试结构。通常,测试文件的命名应与被测试的类相对应,并加上Tests后缀。

(3).利用XCTest的设置和拆解方法

使用setUp()tearDown()方法来为每个测试案例配置必要的环境,这可以在每个测试类中独立进行。

三、XCTest中各种断言如何使用?

在XCTest框架中,断言是用来验证单元测试中条件是否符合预期的关键工具。每个断言都会对表达式或条件进行评估,如果条件不满足则会引发一个失败,这有助于开发者识别和修复错误。

这些断言是XCTest框架的核心部分,通过使用它们,你可以确保你的代码按照预期工作,及时发现和修正潜在的问题。

1.XCTAssert

用途:验证一个条件是否为真。

示例文章来源地址https://www.toymoban.com/news/detail-861218.html

func testExample() {
    let result = true
    XCTAssert(result, "Result should be true")
}

2.XCTAssertTrue 和 XCTAssertFalse

用途:XCTAssertTrue 用来验证条件是否为真;XCTAssertFalse 用来验证条件是否为假。

示例

func testBooleanLogic() {
    let success = true
    let failure = false
    XCTAssertTrue(success, "Success should be true")
    XCTAssertFalse(failure, "Failure should be false")
}

3.XCTAssertEqual 和 XCTAssertNotEqual

用途:XCTAssertEqual 用来验证两个表达式的值是否相等;XCTAssertNotEqual 用来验证两个表达式的值是否不相等。

示例

func testEquality() {
    XCTAssertEqual(1 + 1, 2, "One plus one should equal two")
    XCTAssertNotEqual(1 + 1, 3, "One plus one should not equal three")
}

4.XCTAssertNil 和 XCTAssertNotNil

用途:XCTAssertNil 用来验证一个表达式的结果是否为nil;XCTAssertNotNil 用来验证一个表达式的结果是否不为nil。

示例

func testOptional() {
    var optionalValue: Int? = nil
    XCTAssertNil(optionalValue, "Value should be nil")

    optionalValue = 10
    XCTAssertNotNil(optionalValue, "Value should not be nil")
}

5.XCTAssertThrowsError 和 XCTAssertNoThrow

用途:XCTAssertThrowsError 用来验证一个表达式是否抛出错误;XCTAssertNoThrow 用来验证一个表达式是否没有抛出错误。

示例

func testThrowingFunction() {
    XCTAssertThrowsError(try throwingFunction(), "Function should throw an error")
    XCTAssertNoThrow(try nonThrowingFunction(), "Function should not throw an error")
}

func throwingFunction() throws {
    throw NSError(domain: "", code: 0, userInfo: nil)
}

func nonThrowingFunction() throws {
    // No error is thrown here
}

6.XCTAssertGreaterThan, XCTAssertGreaterThanOrEqual, XCTAssertLessThan, XCTAssertLessThanOrEqual

用途:这些断言用于比较数值,检查一个值是否大于、大于或等于、小于、小于或等于另一个值。

示例

func testComparisons() {
    XCTAssertGreaterThan(10, 9, "10 should be greater than 9")
    XCTAssertGreaterThanOrEqual(10, 10, "10 should be greater than or equal to 10")
    XCTAssertLessThan(9, 10, "9 should be less than 10")
    XCTAssertLessThanOrEqual(9, 9, "9 should be less than or equal to 9")
}

到了这里,关于[Swift]单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于SWIFT和Qwen1.5-14B-Chat进行大模型LoRA微调测试

    操作系统:Ubuntu 18.04.5 LTS (GNU/Linux 3.10.0-1127.el7.x86_64 x86_64) Anaconda3:Anaconda3-2023.03-1-Linux-x86_64 根据服务器网络情况配置好conda源和pip源,此处使用的是超算山河源 服务器硬件配置:CPU 96核;GPU 8×NVIDIA A100 40GB 通过源代码安装SWIFT: 创建一个新的conda环境: 激活刚刚创建的conda环境

    2024年03月09日
    浏览(26)
  • 单元测试:优雅编写Kotlin单元测试

    单元测试:优雅编写Kotlin单元测试

    一、MockK简介 MockK是一款功能强大、易于使用的Kotlin mocking框架。在编写 单元测试 时,MockK能够帮助我们简化代码、提高测试覆盖率,并改善测试的可维护性。除了基本用法外,MockK还提供了许多额外的功能和灵活的用法,让我们能够更好地模拟对象行为、验证函数调用,并在

    2024年02月10日
    浏览(8)
  • 【单元测试】一文读懂java单元测试

    【单元测试】一文读懂java单元测试

    单元测试 是软件开发中常用的一种测试方法,用于验证代码的单个功能单元是否按照预期工作。 测试方法: 白盒测试(White Box Testing):在白盒测试中,测试人员了解代码的内部结构和实现细节,编写测试用例来覆盖不同的代码路径和逻辑条件。 黑盒测试(Black Box Testing)

    2024年04月17日
    浏览(9)
  • QTest 单元测试框架及单元测试思考

    QTest 单元测试框架及单元测试思考

    在不同的公司和不同的项目上,常常会听到单元测试,但是真正能落实的确实寥寥无几,无非是在单元测试的开发时间和回报上模棱两可。 到底是否需要单元测试吗? 引用知乎观点如下: 第一个问题应该是,这个公司需要(覆盖率比较高的)测试么? 对于大部分公司来说,

    2023年04月08日
    浏览(9)
  • IDFA 单元测试以及单元测试覆盖率步骤

    IDFA 单元测试以及单元测试覆盖率步骤

    1、新建java类 随意选择java类文件,新建一个Java类CountVowel,用来统计字符串中元音的个数,代码如下: 2、生成测试类 一)、对写好的类新建测试类,有以下两种方法: 将鼠标光标移动到类名上,使用 Alt+Enter 组合键,如下图,选择 Create Test ,从而新建一个测试类; 右键点

    2024年02月16日
    浏览(11)
  • 单元测试之 - Review一个微服务的单元测试

    单元测试之 - Review一个微服务的单元测试

    这里以github上一个microservice的demo代码为例,来看看如何为一个完整的服务编写单元测试。具体代码如下所示,我们重点查看一下catalog和customer,order中的单元测试有哪些。 首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWebIntegrationTest.java和RepositoryTest.java。下图是

    2024年02月14日
    浏览(10)
  • C# 中的单元测试,如何使用单元测试进行程序测试和调试?

    单元测试是一种软件测试方法,用于测试单个功能或方法是否按预期工作。在 C# 中,可以使用 .NET 框架中的单元测试工具来编写和运行单元测试。 下面是使用 Visual Studio 内置的单元测试框架来创建一个简单的单元测试的步骤: 在 Visual Studio 中创建一个新的类库项目。 在新项

    2024年02月15日
    浏览(16)
  • Service层代码单元测试以及单元测试如何Mock

    Service层代码单元测试以及单元测试如何Mock

    接着上一篇文章:单元测试入门篇,本篇文章作为单元测试的进阶篇,主要介绍如何对Springboot Service层代码做单元测试,以及单元测试中涉及外调服务时,如何通过Mock完成测试。 现在项目都流行前后端代码分离,后端使用springboot框架,在service层编写接口代码实现逻辑。假设

    2023年04月08日
    浏览(8)
  • 单元测试之 - Spring框架提供的单元/集成测试注解

    单元测试之 - Spring框架提供的单元/集成测试注解

    Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。 @RunWith(SpringRunner.class) / @ExtendWith(SpringExtension.class) : 用于在测试类中启用 Spring 框架的支持。

    2024年02月14日
    浏览(11)
  • 吃透单元测试:Spock单元测试框架的应用与实践

    吃透单元测试:Spock单元测试框架的应用与实践

    一,单元测试 单元测试是对软件基本组成单元进行的测试,如函数或一个类的方法。程序是由函数组成的,每个函数都要健壮,这样才能保证程序的整体质量。单元测试是对软件未来的一项必不可少的投资。”具体来说,单元测试有哪些收益呢? 它是最容易保证代码覆盖率

    2024年02月09日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包