XCTest 插件提供了任务、配置和约定,用于与 macOS 上的 XCTest 测试框架以及Linux 的开源实现集成。

使用

build.gradle.kts
plugins {
    xctest
}
build.gradle
plugins {
    id 'xctest'
}

构建变体

XCTest 插件理解以下维度。阅读构建变体简介了解更多信息。

目标机器 - 默认为被测试组件(如果存在)或构建主机(否则)

目标机器表示应用程序期望运行在哪些机器上。目标机器由其操作系统和架构标识。Gradle 使用目标机器根据主机机器上的可用性来决定选择哪个工具链。

可以按如下方式配置目标机器

build.gradle.kts
xctest {
    targetMachines = listOf(machines.linux.x86_64, machines.macOS.x86_64)
}
build.gradle
xctest {
    targetMachines = [
        machines.linux.x86_64,
        machines.macOS.x86_64
    ]
}

任务

下图显示了此插件添加的任务之间的关系。

xctest task graph
图 1. XCTest 插件默认任务图

变体相关任务

XCTest 插件根据测试组件的变体创建任务。阅读构建变体简介了解更多信息。下图显示了变体相关任务之间的关系。

xctest variant task graph
图 2. XCTest 插件变体相关任务图
compileTestVariantSwift(例如 compileTestSwift)- SwiftCompile

依赖于: 所有为编译提供源文件的任务 :: 使用选定的编译器编译 Swift 源文件。

linkTestVariant(例如 linkTest)- LinkMachOBundle(在 macOS 上)或 LinkExecutable(在 Linux 上)

依赖于: 所有有助于链接可执行文件的任务,包括通过项目依赖关系解析的项目以及被测试组件的 linkVariantcreateVariant 任务 :: 使用选定的链接器从已编译的目标文件链接可执行文件。

installTestVariant(例如 installTest)- InstallXCTestBundle(在 macOS 上)或 InstallExecutable(在 Linux 上)

依赖于: linkTestVariant 和所有有助于可执行文件运行时的任务,包括通过项目依赖关系解析的项目中的 linkVariant 任务 :: 安装可执行文件及其所有运行时依赖项,以便于执行。

xcTestVariant(例如 xcTest)- XCTest

依赖于: installTestVariant :: 运行已安装的可执行文件。

生命周期任务

XCTest 插件将其一些任务附加到 Base 插件章节中记录的标准生命周期任务,XCTest 插件会自动应用该插件。

assemble - 任务(生命周期)

聚合任务,用于在项目中(如果存在)为当前主机汇集被测试组件的 debug 变体。例如,Swift Application 插件Swift Library 插件将它们的链接和创建任务附加到此生命周期任务。此任务由Base 插件添加。

test - 任务(生命周期)

依赖于: 与构建主机最匹配的 xcTestVariant :: 与构建主机最匹配的变体的聚合任务,用于测试组件。

check - 任务(生命周期)

依赖于: test :: 执行验证任务的聚合任务,例如运行测试。一些插件将其自己的验证任务添加到 check。此任务由Base 插件添加。

build - 任务(生命周期)

依赖于: check, assemble :: 执行项目完全构建的聚合任务。此任务由Base 插件添加。

clean - 删除

删除 build 目录及其中的所有内容,即由 layout.buildDirectory 项目属性指定的路径。此任务由Base 插件添加。

依赖管理

与 XCTest 插件创建的任务一样,配置是根据应用程序组件的变体创建的。阅读构建变体简介了解更多信息。下图描述了 XCTest 插件添加的配置。

xctest configurations
图 3. XCTest 插件配置
  • 白色框中的配置是用户应该用来声明依赖关系的配置

  • 蓝色框中的配置,也称为可解析配置(用 (R) 表示),是组件内部使用的配置

以下配置用于声明依赖关系

testImplementation

用于声明测试组件所有变体的实现依赖关系。您应该在此处声明任何变体的依赖关系。请注意,此配置会继承在被测试组件(库或应用程序)上声明的所有依赖关系。

testVariantExecutableImplementation(例如 testExecutableImplementation)扩展 testImplementation

用于声明测试组件特定变体的实现依赖关系。您应该在此处声明特定变体的依赖关系。

此插件没有可供消费者使用的配置。

以下配置由测试组件自身使用

swiftCompileTestVariant(例如 swiftCompileTest)扩展 testVariantExecutableImplementation

用于编译测试组件。此配置包含测试组件的编译模块,因此在调用 Swift 编译器进行编译时使用。

nativeLinkTestVariant(例如 nativeLinkTest)扩展 testVariantExecutableImplementation

用于链接测试组件。此配置包含测试组件的库,因此在调用 Swift 链接器进行链接时使用。

nativeRuntimeTestVariant(例如 nativeRuntimeTest)扩展 testVariantExecutableImplementation

用于执行测试组件。此配置包含测试组件的运行时库。

约定

XCTest 插件为源文件和任务添加了约定,如下所示。

项目布局

XCTest 插件假定如下所示的项目布局。这些目录都不需要存在或包含任何内容。XCTest 插件将编译它找到的任何内容,并处理任何缺失的内容。

src/test/swift

扩展名为 .swift 的 Swift 源文件

您可以通过在 xctest 脚本块上配置 source配置项目布局

compileTestVariantSwift 任务

XCTest 插件为要构建的测试组件的每个变体添加一个 SwiftCompile 实例(例如 compileTestSwift)。阅读构建变体简介了解更多信息。下面显示了一些最常见的配置选项。

compilerArgs

[]

debuggable

true

modules

configurations.swiftCompileTestVariant

macros

[]

objectFileDir

layout.buildDirectory.dir("obj/test/$variant")

optimized

false

source

xctest.swiftSource

targetPlatform

派生自二进制文件的 TargetMachine

toolChain

根据目标机器自动选择

XCTest 插件为测试组件的每个变体添加一个 LinkMachOBundle 实例(在 macOS 上)或一个 LinkExecutable 实例(在 Linux 上),例如 linkTest。阅读构建变体简介了解更多信息。下面显示了一些最常见的配置选项。

macOS

debuggable

true

libs

configurations.nativeLinkTestVariant

linkedFile

layout.buildDirectory.dir("exe/test/$variant/module")

linkerArgs

[]

source

compileVariantSwift.objects(如果存在)+ compileTestVariantSwift.objects

targetPlatform

派生自二进制文件的 TargetMachine

toolChain

根据目标机器自动选择

Linux

debuggable

true

libs

configurations.nativeLinkTestVariant

linkedFile

layout.buildDirectory.dir("exe/test/$variant/baseName")

linkerArgs

[]

source

compileVariantSwift.objects(如果存在)+ compileTestVariantSwift.objects

targetPlatform

派生自二进制文件的 TargetMachine

toolChain

根据目标机器自动选择

installTestVariant 任务

XCTest 插件为测试组件的每个变体添加一个 InstallXCTestBundle 实例(在 macOS 上)或一个 InstallExecutable 实例(在 Linux 上),例如 installTest。阅读构建变体简介了解更多信息。无需在任务上配置任何属性。

xcTestVariant 任务

XCTest 插件为测试组件的每个变体添加一个 XCTest 实例,例如 xcTest。阅读构建变体简介了解更多信息。下面显示了一些最常见的配置选项。

binResultDir

layout.buildDirectory.dir("test-results/xctest/$variant/")

ignoreFailures

false

reports

layout.buildDirectory.dir("reports/tests/xctest/$variant/")(仅限 HTML)

runScriptFile

layout.buildDirectory.dir("install/test/$variant/${xctest.module}")

testInstallDirectory

layout.buildDirectory.dir("install/test/$variant/")

workingDirectory

layout.buildDirectory.dir("install/test/$variant/")