SwiftTesting学习总结

179 阅读3分钟

SwiftTesting官方文档

1.了解框架,特性

Prompt: 根据:苹果官网介绍文档,developer.apple.com/cn/xcode/sw…

根据LLM,人工总结:

Prompt: 解释一下,测试框架支持并发,带来哪些好处?

  • 提高测试效率:通过并行执行测试用例,可以显著减少整体的测试时间,提高测试效率。
  • 支持持续集成:并发测试与持续集成流程无缝集成(代码提交,触发构建和测试流程,并发支持减少代码提交拥塞)
  • 提高测试覆盖率:在相同的时间内,可以执行更多的测试用例,提高测试覆盖率

2. 同类对比

Swift Testing和XCtest对比

3. 框架使用-时序图

Swift Testing 开发和测试工作流包括以下步骤:

4. 框架基本概念

Prompt: 根据官方文档:developer.apple.com/documentati… ,总结Swift Testing框架学习的基本概念

5. 单元测试和UI测试

示例代码

举例说明Swift Testing框架的使用, MVVM架构swift项目登录模块的单元测试和UI测试

  • 单元测试
import SwiftTesting
@testable import YourProjectName

@Suite
struct LoginViewModelTests {
    var sut: LoginViewModel! // 被测试对象

    @SetUp
    func setUp() {
        sut = LoginViewModel() // 初始化 ViewModel
    }

    @Test("测试有效登录")
    func testValidLogin() {
        sut.username.value = "validUser"
        sut.password.value = "validPassword"
        sut.login() // 执行登录操作
        #expect(sut.isLoggedIn.value == true, "登录应该成功")
        #expect(sut.errorMessage.value.isEmpty, "不应该有错误消息")
    }

    @Test("测试无效登录(空用户名)")
    func testInvalidLoginEmptyUsername() {
        sut.username.value = ""
        sut.password.value = "validPassword"
        sut.login() // 执行登录操作
        #expect(sut.isLoggedIn.value == false, "登录应该失败")
        #expect(sut.errorMessage.value == "请输入用户名", "应该显示错误消息")
    }

    // 添加更多的测试用例...
}
  • UI 测试(需额外引入XCTest)
import SwiftTesting
import XCTest
@testable import YourProjectName

@Suite
struct LoginViewControllerTests {
    var app: XCUIApplication! // XCUIApplication 实例

    @SetUp
    func setUp() {
        app = XCUIApplication() // 初始化 XCUIApplication
        app.launch() // 启动应用
    }

    @Test("测试登录界面显示")
    func testLoginScreenDisplay() {
        #expect(app.staticTexts["登录"].exists, "应该显示登录标题")
        #expect(app.textFields["用户名"].exists, "应该显示用户名输入框")
        #expect(app.secureTextFields["密码"].exists, "应该显示密码输入框")
        #expect(app.buttons["登录"].exists, "应该显示登录按钮")
    }

    @Test("测试有效登录流程")
    func testValidLoginFlow() {
        let usernameTextField = app.textFields["用户名"]
        let passwordTextField = app.secureTextFields["密码"]
        let loginButton = app.buttons["登录"]

        usernameTextField.tap() // 点击用户名输入框
        usernameTextField.typeText("validUser") // 输入有效用户名

        passwordTextField.tap() // 点击密码输入框
        passwordTextField.typeText("validPassword") // 输入有效密码

        loginButton.tap() // 点击登录按钮

        #expect(app.staticTexts["登录成功"].exists, "应该显示登录成功消息") // 根据你的应用逻辑进行断言
    }

    // 添加更多的 UI 测试用例...
}

6. Develop Flow(开发工作流)

需求开发Flow

自动化

Fastlane为例

default_platform(:ios)

platform :ios do
  desc "Run UI tests"
  lane :ui_tests do
    scan(
      scheme: "YourUITestScheme",
      device: "iPhone 12",
      configuration: "Debug",
      clean: true,
      code_coverage: true
    )
  end

  desc "Run unit tests"
  lane :unit_tests do
    scan(
      scheme: "YourUnitTestScheme",
      device: "iPhone 12",
      configuration: "Debug",
      clean: true,
      code_coverage: true
    )
  end
  
    # 执行所有测试
    lane :all_tests do
      unit_tests
      ui_tests
    end
end

测试报告

7. CI/CD

团队协作,多人提交代码后,触发自动化测试(SwiftTesting支持并发,加快模块集成效率)

Github Actions为例

name: CI/CD

on: [push, pull_request]

jobs:
  build-and-test:
    runs-on: macOS-latest

    steps:
    - uses: actions/checkout@v2
    - name: Install Fastlane
      run: gem install fastlane
    - name: Run UI tests
      run: fastlane ui_tests
    - name: Run unit tests
      run: fastlane unit_tests