ctest(1)

概要

Run Tests
 ctest [<options>] [--test-dir <path-to-build>]

Build and Test Mode
 ctest --build-and-test <path-to-source> <path-to-build>
       --build-generator <generator> [<options>...]
      [--build-options <opts>...]
      [--test-command <command> [<args>...]]

Dashboard Client
 ctest -D <dashboard>         [-- <dashboard-options>...]
 ctest -M <model> -T <action> [-- <dashboard-options>...]
 ctest -S <script>            [-- <dashboard-options>...]
 ctest -SP <script>           [-- <dashboard-options>...]

View Help
 ctest --help[-<topic>]

描述

ctest 可执行文件是 CMake 的测试驱动程序。对于使用 enable_testing()add_test() 命令的项目,CMake 生成的构建树都具有测试支持。该程序将运行测试并报告结果。

运行测试

--preset <preset>, --preset=<preset>

使用测试预设来指定测试选项。项目二进制目录由 configurePreset 键推断得出。当前工作目录必须包含 CMake 预设文件。更多详细信息,请参阅 preset

--list-presets

列出可用的测试预设。当前工作目录必须包含 CMake 预设文件。

-C <cfg>, --build-config <cfg>

选择要测试的配置。

一些 CMake 生成的构建树可能在同一树中具有多种构建配置。此选项可用于指定应测试哪一个。示例配置包括 DebugRelease

--progress

启用来自测试的简短进度输出。

ctest 的输出直接发送到终端时,测试集的进度将通过更新同一行来报告,而不是为每个测试在单独的新行上打印开始和结束消息。这可以显著减少测试输出的冗长程度。对于失败的测试,测试完成消息仍会在单独的行上输出,最终测试摘要也将被记录。

此选项也可以通过设置环境变量 CTEST_PROGRESS_OUTPUT 来启用。

-V, --verbose

启用来自测试的详细输出。

测试输出通常会被禁止,仅显示摘要信息。此选项将显示所有测试输出。

-VV, --extra-verbose

启用来自测试的更详细输出。

测试输出通常会被禁止,仅显示摘要信息。此选项将显示更多测试输出。

--debug

显示 CTest 更详细的内部信息。

此功能将产生大量的输出,主要用于调试仪表盘问题。

--output-on-failure

如果测试失败,则输出测试程序输出的任何内容。此选项也可以通过设置 CTEST_OUTPUT_ON_FAILURE 环境变量来启用。

--stop-on-failure

当第一次失败发生时停止运行测试。

-F

启用故障恢复。

此选项允许 CTest 恢复之前中断的测试集执行。如果没有发生中断,-F 选项将无效。

-j [<level>], --parallel [<level>]

并行运行测试,可选择限制并行级别。

Added in version 3.29: 可以省略 <level>,或者设置为 0,在这种情况下:

  • 作业服务器集成 下,并行度受可用作业令牌限制。

  • 否则,如果省略该值,并行度受处理器数量限制,或者为 2,以较大者为准。

  • 否则,如果值为 0,则并行度不受限制。

此选项也可以通过 CTEST_PARALLEL_LEVEL 环境变量指定。

此选项可与 PROCESSORS 测试属性一起使用。请参阅 标签与子项目摘要

--resource-spec-file <file>

在启用 资源分配 的情况下运行 CTest,使用 <file> 中指定的 资源规范文件

ctest 作为 仪表盘客户端 运行时,这会设置 CTest 测试步骤ResourceSpecFile 选项。

--test-load <level>

在并行运行测试时(例如使用 -j),尽量不要在 CPU 负载可能超过给定阈值时启动测试。

ctest 作为 仪表盘客户端 运行时,这会设置 CTest 测试步骤TestLoad 选项。

-Q, --quiet

使 CTest 安静运行。

此选项将禁止所有输出。如果指定了 --output-log,仍会生成输出日志文件。如果指定了 --quiet,诸如 --verbose--extra-verbose--debug 等选项将被忽略。

-O <file>, --output-log <file>

输出到日志文件。

此选项告诉 CTest 将其所有输出写入 <file> 日志文件。

--output-junit <file>

3.21 版本新增。

以 JUnit 格式写入测试结果。

此选项告诉 CTest 以 JUnit XML 格式将测试结果写入 <file>。如果 <file> 已经存在,它将被覆盖。如果使用 -S 选项运行仪表盘脚本,请改用 ctest_test() 命令的 OUTPUT_JUNIT 关键字。

-N, --show-only[=<format>]

禁止实际执行测试。

此选项告诉 CTest 列出将要运行的测试,但不要真正运行它们。与 -R-E 选项结合使用时非常有用。

Added in version 3.14: --show-only 选项接受一个 <format> 值。

<format> 可以是以下值之一。

人工

人类可读输出。不保证其稳定性。这是默认值。

json-v1

以 JSON 格式导出测试信息。请参阅 显示为 JSON 对象模型

-L <regex>, --label-regex <regex>

运行标签匹配正则表达式的测试,如 string(REGEX) 下所述。

此选项告诉 CTest 仅运行标签与给定正则表达式匹配的测试。当给出多个 -L 选项时,只有当每个正则表达式至少匹配测试的一个标签时,测试才会被运行(即多个 -L 标签形成 AND 关系)。请参阅 标签匹配

-R <regex>, --tests-regex <regex>

运行名称匹配正则表达式的测试。

此选项告诉 CTest 仅运行名称与给定正则表达式匹配的测试。

-E <regex>, --exclude-regex <regex>

排除名称匹配正则表达式的测试。

此选项告诉 CTest 不要运行名称与给定正则表达式匹配的测试。

-LE <regex>, --label-exclude <regex>

排除标签匹配正则表达式的测试。

此选项告诉 CTest 不要运行标签与给定正则表达式匹配的测试。当给出多个 -LE 选项时,只有当每个正则表达式至少匹配测试的一个标签时,测试才会被排除(即多个 -LE 标签形成 AND 关系)。请参阅 标签匹配

--tests-from-file <filename>

在版本 3.29 中添加。

运行给定文件中列出的测试。

此选项告诉 CTest 运行给定文件中列出的测试。该文件必须每行包含一个精确的测试名称。与任何测试名称不完全匹配的行将被忽略。此选项可以与 -R-E-L-LE 等其他选项组合使用。

--exclude-from-file <filename>

在版本 3.29 中添加。

排除给定文件中列出的测试。

此选项告诉 CTest 不要运行给定文件中列出的测试。该文件必须每行包含一个精确的测试名称。与任何测试名称不完全匹配的行将被忽略。此选项可以与 -R-E-L-LE 等其他选项组合使用。

-FA <regex>, --fixture-exclude-any <regex>

从自动添加到测试集的测试中排除与 <regex> 匹配的夹具(fixture)。

如果待执行测试集中的某个测试需要特定的夹具,该夹具的设置(setup)和清理(cleanup)测试通常会自动添加到测试集中。此选项可防止添加与 <regex> 匹配的夹具的设置或清理测试。请注意,所有其他夹具行为均保留,包括测试依赖项以及跳过具有失败设置测试的测试。

-FS <regex>, --fixture-exclude-setup <regex>

-FA 相同,但仅排除匹配的设置测试。

-FC <regex>, --fixture-exclude-cleanup <regex>

-FA 相同,但仅排除匹配的清理测试。

-I [Start,End,Stride,test#,test#|Test file], --tests-information

通过编号运行特定数量的测试。

此选项使 CTest 运行从 Start 开始,以 End 结束,并以 Stride 步长递增的测试。在 Stride 之后的任何额外数字都被视为单独的测试编号。StartEndStride 可以为空。可选择提供一个包含与命令行语法相同的文件。

-U, --union

-I-R 取并集。

当同时指定 -R-I 时,默认运行这些测试的交集。通过指定 -U,将运行这些测试的并集。

--rerun-failed

仅运行之前失败的测试。

此选项告诉 CTest 仅执行其上一次运行期间失败的测试。指定此选项时,CTest 会忽略所有旨在修改待运行测试列表的其他选项(-L-R-E-LE-I 等)。如果 CTest 运行后没有测试失败,则后续带有 --rerun-failed 选项的 CTest 调用将运行最近一次失败的测试集(如果有)。

--repeat <mode>:<n>

根据给定的 <mode> 重复运行测试,最多 <n> 次。模式包括:

until-fail

要求每个测试在不失败的情况下运行 <n> 次才算通过。这对于查找测试用例中的偶发失败非常有用。

until-pass

允许每个测试最多运行 <n> 次以通过。如果测试因任何原因失败,则重复该测试。这对于容忍测试用例中的偶发失败非常有用。

after-timeout

允许每个测试最多运行 <n> 次以通过。仅在测试超时时才重复该测试。这对于容忍繁忙机器上测试用例中的偶发超时非常有用。

--repeat-until-fail <n>

等同于 --repeat until-fail:<n>

--max-width <width>

设置输出测试名称的最大宽度。

设置输出中显示的每个测试名称的最大宽度。这允许用户加宽输出,以避免截断测试名称,这有时非常令人困扰。

--interactive-debug-mode <0|1>

禁用(0)或启用(1)交互式调试模式。

此选项使 CTest 以交互模式或非交互模式运行测试。在仪表盘模式(ExperimentalNightlyContinuous)中,默认为非交互式。在非交互式模式下,环境变量 DASHBOARD_TEST_FROM_CTEST 被设置。

交互模式允许 Windows 错误报告 (WER) 显示调试弹出窗口并创建核心转储。要在测试中启用核心转储,请使用交互模式,并遵循 Windows 文档关于 收集用户模式转储 (Collecting User-Mode Dumps) 的说明。

Changed in version 4.0: Windows 错误报告 (WER) 在交互模式下已启用,因此测试进程可能会显示调试弹出窗口并创建核心转储。这得益于 libuv 的更新。

Changed in version 3.11: Windows 错误报告 (WER) 在交互和非交互模式下均被禁用,因此测试进程不会显示弹出窗口或创建核心转储。这是由于使用 libuv 启动测试进程所致。

--no-label-summary

禁用标签的时间摘要信息。

此选项告诉 CTest 不要为与所运行测试关联的每个标签打印摘要信息。如果测试上没有标签,则不会打印额外内容。

请参阅 标签与子项目摘要

--no-subproject-summary

禁用子项目的时间摘要信息。

此选项告诉 CTest 不要为与所运行测试关联的每个子项目打印摘要信息。如果测试上没有子项目,则不会打印额外内容。

请参阅 标签与子项目摘要

--test-dir <dir>

在 3.20 版本中添加。

指定查找测试的目录,通常是 CMake 项目的构建目录。如果未指定,则使用当前目录。

--test-output-size-passed <size>

3.4 版本新增。

将通过的测试的输出限制为 <size> 字节。

--test-output-size-failed <size>

3.4 版本新增。

将失败的测试的输出限制为 <size> 字节。

--test-output-truncation <mode>

在 3.24 版本中添加。

当达到最大输出大小时,截断测试输出的 tail(默认)、middlehead 部分。

--overwrite

覆盖 CTest 配置选项。

默认情况下,CTest 使用配置文件中的配置选项。此选项将覆盖该配置选项。

--force-new-ctest-process

已忽略。此选项曾经禁用了对运行 ctest 本身的测试的一项现已移除的优化。

--schedule-random

使用随机顺序进行测试调度。

此选项将以随机顺序运行测试。它通常用于检测测试套件中的隐式依赖关系。

--schedule-random-seed

在 4.1 版本中新增。

覆盖随机顺序种子。

此选项用于重现由于 --schedule-random 导致的随机执行顺序而产生的失败。

--submit-index

针对旧 Dart2 仪表盘服务器功能的遗留选项。请勿使用。

--timeout <seconds>

设置默认测试超时时间。

此选项实际上为所有尚未通过 TIMEOUT 属性设置超时时间的测试设置了超时时间。

--stop-time <time>

设置所有测试应停止运行的时间。

设置所有测试应超时的真实时间。例如:7:00:00 -0400。接受 curl 日期解析器可理解的任何时间格式。如果未指定时区,则假定为本地时间。

--print-labels

打印所有可用的测试标签。

此选项不会运行任何测试,它只会打印与测试集关联的所有标签列表。

--no-tests=<action>

将未找到测试视为错误(当 <action> 设置为 error 时)或忽略它(当 <action> 设置为 ignore 时)。

如果未找到测试,CTest 的默认行为始终是记录一条错误消息,但仅在脚本模式下返回错误代码。此选项统一了 CTest 的行为,即未找到测试时返回错误代码或忽略它。

3.26 版新增。

此选项也可以通过设置 CTEST_NO_TESTS_ACTION 环境变量来设置。

--collect-instrumentation <build>

4.0 版本新增。

手动从指定的构建目录收集指令数据。更多详细信息,请参阅 CMake 指令中的 索引 (Indexing) 部分。

查看帮助

要打印版本详细信息或 CMake 文档中的选定页面,请使用以下选项之一

-version[=json-v1] [<file>], --version[=json-v1] [<file>], /V[=json-v1] [<file>], /version[=json-v1] [<file>]

显示程序名称/版本横幅并退出。如果指定了 json-v1,则以 JSON 格式打印扩展版本信息。JSON 输出包含 CMake 及其依赖项的版本。如果给定了 <file>,输出将被打印到该指定文件。

JSON 输出格式以机器可读的形式由 此 JSON 模式 描述。

-h, -H, --help, -help, -usage, /?

打印使用信息并退出。

使用说明描述了基本的命令行界面及其选项。

--help <keyword> [<file>]

打印一个 CMake 关键字的帮助。

<keyword> 可以是属性、变量、命令、策略、生成器或模块。

相关的 <keyword> 手册条目以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

3.28 版本变更:在 CMake 3.28 之前,此选项仅支持命令名称。

--help-full [<file>]

打印所有帮助手册并退出。

所有手册都以人类可读的文本格式打印。如果给定,输出将打印到指定 <file>

--help-manual <man> [<file>]

打印一个帮助手册并退出。

指定的手册以人类可读的文本格式打印。如果给定,输出将打印到指定 <file>

--help-manual-list [<file>]

列出可用的帮助手册并退出。

列表包含所有可以通过使用 `--help-manual` 选项后跟手册名称来获取帮助的手册。如果指定了 <file>,则输出将打印到该文件。

--help-command <cmd> [<file>]

打印一个命令的帮助并退出。

cmake-commands(7) 手册条目以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-command-list [<file>]

列出可获取帮助的命令并退出。

列表包含所有可以通过使用 `--help-command` 选项后跟命令名称来获取帮助的命令。如果指定了 <file>,则输出将打印到该文件。

--help-commands [<file>]

打印 cmake-commands 手册并退出。

cmake-commands(7) 手册以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-module <mod> [<file>]

打印一个模块的帮助并退出。

cmake-modules(7) 手册条目以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-module-list [<file>]

列出可获取帮助的模块并退出。

列表包含所有可以通过使用 `--help-module` 选项后跟模块名称来获取帮助的模块。如果指定了 <file>,则输出将打印到该文件。

--help-modules [<file>]

打印 cmake-modules 手册并退出。

cmake-modules(7) 手册以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-policy <cmp> [<file>]

打印一个策略的帮助并退出。

cmake-policies(7) 手册条目以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-policy-list [<file>]

列出可获取帮助的策略并退出。

列表包含所有可以通过使用 `--help-policy` 选项后跟策略名称来获取帮助的策略。如果指定了 <file>,则输出将打印到该文件。

--help-policies [<file>]

打印 cmake-policies 手册并退出。

cmake-policies(7) 手册以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-property <prop> [<file>]

打印一个属性的帮助并退出。

cmake-properties(7) 手册条目以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-property-list [<file>]

列出可获取帮助的属性并退出。

列表包含所有可以通过使用 `--help-property` 选项后跟属性名称来获取帮助的属性。如果指定了 <file>,则输出将打印到该文件。

--help-properties [<file>]

打印 cmake-properties 手册并退出。

cmake-properties(7) 手册以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-variable <var> [<file>]

打印一个变量的帮助并退出。

cmake-variables(7) 手册条目以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

--help-variable-list [<file>]

列出可获取帮助的变量并退出。

列表包含所有可以通过使用 `--help-variable` 选项后跟变量名称来获取帮助的变量。如果指定了 <file>,则输出将打印到该文件。

--help-variables [<file>]

打印 cmake-variables 手册并退出。

cmake-variables(7) 手册以人类可读的文本格式打印。如果指定了 <file>,则输出将打印到该文件。

标签匹配

测试可以附加标签。可以通过对标签进行过滤来包含或排除测试。每个单独的过滤器都是一个应用于测试标签的正则表达式。

当使用 -L 时,为了让测试包含在测试运行中,每个正则表达式必须至少匹配一个标签。使用多个 -L 选项意味着“匹配这些选项中的所有”。

-LE 选项的作用与 -L 相同,但它排除测试而不是包含它们。如果每个正则表达式都至少匹配一个标签,则该测试被排除。

如果测试没有附加标签,则 -L 永远不会包含该测试,而 -LE 永远不会排除该测试。作为带有标签的测试示例,考虑五个测试,它们具有以下标签:

  • test1 具有标签 tuesdayproduction

  • test2 具有标签 tuesdaytest

  • test3 具有标签 wednesdayproduction

  • test4 具有标签 wednesday

  • test5 具有标签 fridaytest

运行带有 -L tuesday -L testctest 将选择 test2,因为它具有这两个标签。运行带有 -L test 的 CTest 将选择 test2test5,因为它们都具有一个与该正则表达式匹配的标签。

由于匹配是通过正则表达式进行的,请注意,运行带有 -L es 的 CTest 将匹配所有五个测试。要同时选择 tuesdaywednesday 测试,请使用匹配其中任何一个的单个正则表达式,例如 -L "tue|wed"

标签与子项目摘要

CTest 会为每个 LABEL 和与所运行测试关联的子项目打印时间摘要信息。标签时间摘要将不包括映射到子项目的标签。

Added in version 3.22: 测试执行期间动态添加的标签也会在时间摘要中报告。请参阅 其他标签 (Additional Labels)

当设置了 PROCESSORS 测试属性时,CTest 将在标签和子项目摘要中显示加权测试时间结果。时间报告为 sec * proc 而不仅仅是 sec

为每个标签或子项目 j 报告的加权时间摘要计算如下:

Weighted Time Summary for Label/Subproject j =
    sum(raw_test_time[j,i] * num_processors[j,i], i=1...num_tests[j])

for labels/subprojects j=1...total

其中:

  • raw_test_time[j,i]j 标签或子项目下第 i 个测试的挂钟时间。

  • num_processors[j,i]j 标签或子项目下第 i 个测试的 CTest PROCESSORS 属性值。

  • num_tests[j]:与 j 标签或子项目关联的测试数量。

  • total:至少运行了一个测试的标签或子项目的总数。

因此,每个标签或子项目的加权时间摘要代表了 CTest 为运行该标签或子项目的测试所分配的时间量,并且在与其他标签或子项目进行比较时,很好地代表了这些测试的总开销。

例如,如果 SubprojectA 显示为 100 sec*procSubprojectB 显示为 10 sec*proc,那么 CTest 分配给运行 SubprojectA 的测试的 CPU/核心时间大约是 SubprojectB 的 10 倍(例如,如果要投入精力减少整个项目的测试套件成本,那么减少 SubprojectA 的测试套件成本可能比减少 SubprojectB 的测试套件成本产生更大的影响)。

构建和测试模式

CTest 提供了一个命令行签名来配置(即运行 cmake)、构建和/或执行测试。

ctest --build-and-test <path-to-source> <path-to-build>
      --build-generator <generator>
      [<options>...]
      [--build-options <opts>...]
      [--test-command <command> [<args>...]]

配置和测试步骤是可选的。此命令行的参数是源目录和二进制目录。必须提供 --build-generator 选项才能使用 --build-and-test。如果指定了 --test-command,则该命令将在构建完成后运行。影响此模式的其他选项包括:

--build-and-test

切换到构建和测试模式。

--build-target

指定要构建的特定目标。该选项可以多次指定不同的目标,在这种情况下,每个目标将依次构建。除非给出了 --build-noclean 选项,否则在构建每个目标之前都会执行清理操作。

如果未指定 --build-target,则构建 all 目标。

--build-nocmake

运行构建而不先运行 cmake。

跳过 cmake 步骤。

--build-run-dir

指定运行程序的目录。

编译程序后程序所在的目录。

--build-two-config

运行 CMake 两次。

--build-exe-dir

指定可执行文件的目录。

--build-generator

指定要使用的生成器。请参阅 cmake-generators(7) 手册。

--build-generator-platform

指定生成器特定的平台。

--build-generator-toolset

指定生成器特定的工具集。

--build-project

指定要构建的项目名称。

--build-makeprogram

指定 CMake 在配置和构建项目时要使用的明确的 make 程序。仅适用于基于 Make 和 Ninja 的生成器。

--build-noclean

跳过 make clean 步骤。

--build-config-sample

用于确定应使用哪种配置的示例可执行文件。例如 DebugRelease 等。

--build-options

配置构建的附加选项(即针对 CMake,而不是构建工具)。请注意,如果指定了此选项,--build-options 关键字及其参数必须是命令行上给出的最后一个选项,但 --test-command 可能除外。

--test-command

作为 --build-and-test 选项的测试步骤运行的命令。此关键字后面的所有参数都将被视为测试命令行的一部分,因此它必须是给出的最后一个选项。

--test-timeout

以秒为单位的时间限制。

仪表盘客户端

CTest 可以作为 CDash 软件质量仪表盘应用程序的客户端运行。作为仪表盘客户端,CTest 执行一系列步骤来配置、构建和测试软件,然后将结果提交给 CDash 服务器。用于提交给 CDash 的命令行签名为:

ctest -D <dashboard>         [-- <dashboard-options>...]
ctest -M <model> -T <action> [-- <dashboard-options>...]
ctest -S <script>            [-- <dashboard-options>...]
ctest -SP <script>           [-- <dashboard-options>...]

仪表盘客户端的选项包括:

-D <dashboard>, --dashboard <dashboard>

执行仪表盘测试。

此选项告诉 CTest 作为 CDash 客户端运行并执行仪表盘测试。所有测试都是 <Mode><Test>,其中 <Mode> 可以是 ExperimentalNightlyContinuous,而 <Test> 可以是 StartUpdateConfigureBuildTestCoverageSubmit

如果 <dashboard> 不是识别的 <Mode><Test> 值之一,它将被视为变量定义(请参阅下方的 仪表盘选项)。

-M <model>, --test-model <model>

设置仪表盘的模型。

此选项告诉 CTest 作为 CDash 客户端运行,其中 <model> 可以是 ExperimentalNightlyContinuous。结合 -M-T 类似于 -D

-T <action>, --test-action <action>

设置要执行的仪表盘操作。

此选项告诉 CTest 作为 CDash 客户端运行并执行某些操作,如 startbuildtest 等。有关操作的完整列表,请参阅 仪表盘客户端步骤。结合 -M-T 类似于 -D

-S <script>, --script <script>

为配置执行仪表盘。

此选项告诉 CTest 加载一个配置文件脚本,该脚本设置了许多参数,例如二进制目录和源目录。然后 CTest 将执行所需的操作来创建和运行仪表盘。此选项基本上设置了一个仪表盘,然后使用适当的选项运行 ctest -D

-SP <script>, --script-new-process <script>

为配置执行仪表盘。

此选项执行与 -S 相同的操作,但它将在单独的进程中执行。这主要在脚本可能修改环境且您不希望修改后的环境影响其他 -S 脚本的情况下非常有用。

可用的 <dashboard-options> 如下所示:

-D <var>:<type>=<value>

为脚本模式定义一个变量。

在命令行上传递变量值。与 -S 结合使用,将变量值传递给仪表盘脚本。仅当 -D 后面的值与任何已知的仪表盘类型不匹配时,才会尝试将 -D 参数解析为变量值。

--group <group>

指定您希望将结果提交给哪个组。

将仪表盘提交给指定的组,而不是默认组。默认情况下,仪表盘提交到 Nightly、Experimental 或 Continuous 组,但通过指定此选项,组可以是任意的。

这取代了已弃用的 --track 选项。尽管名称发生了变化,但其行为保持不变。

-A <file>, --add-notes <file>

添加包含提交的注释文件。

此选项告诉 CTest 在提交仪表盘时包含一个注释文件。

--tomorrow-tag

NightlyExperimental 以第二天的标记开始。

这在构建无法在一天内完成时非常有用。

--extra-submit <file>[;<file>]

将额外的 .xml 部分文件提交给仪表盘。请参阅 ctest_submit() 命令的 PARTS ExtraFiles 选项。

--http-header <header>

在版本 3.29 中添加。

提交到仪表盘时附加 HTTP 头。

此选项将导致 CTest 在提交到仪表盘时附加指定的头。此选项可以多次指定。

--http1.0

使用 HTTP 1.0 进行提交。

此选项将强制 CTest 使用 HTTP 1.0 向仪表盘提交文件,而不是 HTTP 1.1

--no-compress-output

提交时不要压缩测试输出。

此标志将关闭测试输出的自动压缩。使用此选项可保持与不支持压缩测试输出的旧版本 CDash 的兼容性。

仪表盘客户端步骤

CTest 定义了一个有序的测试步骤列表,其中部分或全部步骤可以作为仪表盘客户端运行:

Start(开始)

启动一个新的仪表板提交,由以下步骤记录的结果组成。请参阅下方的 CTest 启动步骤 部分。

更新 (Update)

从版本控制仓库更新源码树。记录旧版本、新版本以及更新后的源文件列表。请参阅下方的 CTest 更新步骤 部分。

配置 (Configure)

通过在构建树中运行命令来配置软件。记录配置输出日志。请参阅下方的 CTest 配置步骤 部分。

构建 (Build)

通过在构建树中运行命令来构建软件。记录构建输出日志,并检测警告和错误。请参阅下方的 CTest 构建步骤 部分。

测试 (Test)

通过从构建树加载 CTestTestfile.cmake 并执行定义的测试来测试软件。记录每个测试的输出和结果。请参阅下方的 CTest 测试步骤 部分。

覆盖率 (Coverage)

通过运行覆盖率分析工具并记录其输出来计算源代码的覆盖率。请参阅下方的 CTest 覆盖率步骤 部分。

内存检查 (MemCheck)

通过内存检查工具运行软件测试套件。记录测试输出、结果以及该工具报告的问题。请参阅下方的 CTest 内存检查步骤 部分。

提交 (Submit)

将其他测试步骤中记录的结果提交到软件质量仪表板服务器。请参阅下方的 CTest 提交步骤 部分。

仪表板客户端模式

CTest 定义了作为仪表板客户端的三种操作模式

夜间模式 (Nightly)

此模式旨在每天调用一次,通常在夜间。默认情况下,它启用 StartUpdateConfigureBuildTestCoverageSubmit 步骤。即使 Update 步骤报告源码树没有变更,所选步骤也会运行。

持续模式 (Continuous)

此模式旨在全天反复调用。默认情况下,它启用 StartUpdateConfigureBuildTestCoverageSubmit 步骤,但如果 Update 步骤报告源码树没有变更,它会在该步骤后退出。

实验模式 (Experimental)

此模式旨在由开发人员调用以测试本地更改。默认情况下,它启用 StartConfigureBuildTestCoverageSubmit 步骤。

通过 CTest 命令行使用的仪表板客户端

CTest 可以在已生成的构建树上执行测试。在构建树目录中运行 ctest 命令,并使用以下签名之一

ctest -D <mode>[<step>]
ctest -M <mode> [-T <step>]...

<mode> 必须是上述 仪表板客户端模式 之一,且每个 <step> 必须是上述 仪表板客户端步骤 之一。

CTest 从构建树中的 CTestConfiguration.iniDartConfiguration.tcl(名称具有历史沿革)文件中读取 仪表板客户端配置 设置。该文件的格式为

# Lines starting in '#' are comments.
# Other non-blank lines are key-value pairs.
<setting>: <value>

其中 <setting> 是设置名称,<value> 是设置值。

在 CMake 生成的构建树中,此配置文件由 CTest 模块生成(如果项目包含了该模块)。该模块使用变量来获取每个设置的值,如下方的设置文档所述。

通过 CTest 脚本使用的仪表板客户端

CTest 可以通过 cmake-language(7) 脚本来执行测试,该脚本负责创建和维护源码树及构建树,并执行测试步骤。在任意构建树之外的当前工作目录中运行 ctest 命令,并使用以下签名之一

ctest -S <script>
ctest -SP <script>

<script> 文件必须调用 CTest 命令 来显式运行测试步骤(如下所述)。这些命令通过其参数或脚本中设置的变量来获取 仪表板客户端配置 设置。

仪表板客户端配置

仪表板客户端步骤 可以通过下述各节中记录的命名设置进行配置。

CTest 启动步骤

启动一个新的仪表板提交,由后续步骤记录的结果组成。

CTest 脚本 中,ctest_start() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。如果设置了 CTEST_CHECKOUT_COMMAND 变量,该命令会首先运行此变量指定的命令行,以初始化源码目录。

配置设置包括

BuildDirectory

项目构建树的完整路径。

SourceDirectory

项目源码树的完整路径。

CTest 更新步骤

CTest 脚本 中,ctest_update() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

用于指定版本控制工具的配置设置包括

BZRCommand

如果源码树由 Bazaar 管理,则使用此 bzr 命令行工具。

BZRUpdateOptions

更新源码时传给 BZRCommand 的命令行选项。

CVSCommand

如果源码树由 CVS 管理,则使用此 cvs 命令行工具。

CVSUpdateOptions

更新源码时传给 CVSCommand 的命令行选项。

GITCommand

如果源码树由 Git 管理,则使用此 git 命令行工具。

源码树通过执行 git fetch 接着执行 git reset --hardFETCH_HEAD 来更新。其结果与 git pull 相同,但会覆盖任何本地修改。使用 GITUpdateCustom 来指定不同的更新方法。

GITInitSubmodules

如果设置,CTest 将在更新前更新仓库的子模块。

GITUpdateCustom

指定一个自定义命令行(以分号分隔的列表),在源码树(Git 工作树)中运行以替代运行 GITCommand 来更新它。

GITUpdateOptions

更新源码时传给 GITCommand 的命令行选项。

HGCommand

如果源码树由 Mercurial 管理,则使用此 hg 命令行工具。

HGUpdateOptions

更新源码时传给 HGCommand 的命令行选项。

P4Client

P4Command-c 选项的值。

P4Command

如果源码树由 Perforce 管理,则使用此 p4 命令行工具。

P4Options

所有调用中传给 P4Command 的命令行选项。

P4UpdateCustom

指定一个自定义命令行(以分号分隔的列表),在源码树(Perforce 树)中运行以替代运行 P4Command 来更新它。

P4UpdateOptions

更新源码时传给 P4Command 的命令行选项。

SVNCommand

如果源码树由 Subversion 管理,则使用此 svn 命令行工具。

SVNOptions

所有调用中传给 SVNCommand 的命令行选项。

SVNUpdateOptions

更新源码时传给 SVNCommand 的命令行选项。

UpdateCommand

指定要使用的版本控制命令行工具,而不检测管理源码树的 VCS。

UpdateOptions

传给 UpdateCommand 的命令行选项。

UpdateType

如果无法自动检测,请指定管理源码树的版本控制系统。值可以是 bzr, cvs, git, hg, p4svn

  • CTest 脚本 变量:无,从源码树检测

  • CTest 模块变量:如果已设置则为 UPDATE_TYPE,否则为 CTEST_UPDATE_TYPE

UpdateVersionOnly

指定您希望版本控制更新命令仅发现当前检出的版本,而不更新到不同的版本。

UpdateVersionOverride

指定您的源码树的当前版本。

当此变量设置为非空字符串时,CTest 将报告您指定的值,而不是使用更新命令来发现当前检出的版本。使用此变量将覆盖 UpdateVersionOnly。与 UpdateVersionOnly 一样,使用此变量会告诉 CTest 不要将源码树更新到不同的版本。

其他配置设置包括

NightlyStartTime

Nightly 仪表板模式下,指定“夜间开始时间”。对于集中式版本控制系统(cvssvn),Update 步骤会检出截至该时间的软件版本,以便多个客户端选择相同的版本进行测试。这在分布式版本控制系统中没有明确定义,因此该设置会被忽略。

CTest 配置步骤

CTest 脚本 中,ctest_configure() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

配置设置包括

ConfigureCommand

用于启动软件配置过程的命令行。它将在 BuildDirectory 设置指定的位置执行。

LabelsForSubprojects

指定一个分号分隔的标签列表,这些标签将被视为子项目。当提交配置、测试或构建结果时,此映射将传递给 CDash。

请参阅 标签与子项目摘要

CTest 构建步骤

CTest 脚本 中,ctest_build() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

配置设置包括

DefaultCTestConfigurationType

当启动的构建系统允许在构建时选择配置(例如 Debug, Release)时,此项指定当未向 ctest 命令提供 -C 选项时所构建的默认配置。如果字面字符串 ${CTEST_CONFIGURATION_TYPE} 出现在 MakeCommand 中,该值将被替换。

LabelsForSubprojects

指定一个分号分隔的标签列表,这些标签将被视为子项目。当提交配置、测试或构建结果时,此映射将传递给 CDash。

请参阅 标签与子项目摘要

MakeCommand

用于启动软件构建过程的命令行。它将在 BuildDirectory 设置指定的位置执行。

UseLaunchers

对于通过 CMake 使用 Makefile 生成器Ninja 生成器生成的构建树,指定 CTestUseLaunchers 模块(也包含在 CTest 模块中)是否启用了 CTEST_USE_LAUNCHERS 功能。启用后,生成的构建系统会使用“启动器”包装编译器、链接器或自定义命令行的每次调用,该启动器通过环境变量和文件与 CTest 通信,以报告细粒度的构建警告和错误信息。否则,CTest 必须通过“抓取”构建输出日志来获取诊断信息。

CTest 测试步骤

CTest 脚本 中,ctest_test() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

配置设置包括

ResourceSpecFile

指定一个 资源规范文件

有关详细信息,请参阅 资源分配

LabelsForSubprojects

指定一个分号分隔的标签列表,这些标签将被视为子项目。当提交配置、测试或构建结果时,此映射将传递给 CDash。

请参阅 标签与子项目摘要

TestLoad

在并行运行测试时(例如使用 -j),尽量不要在 CPU 负载可能超过给定阈值时启动测试。

TimeOut

如果未通过 TIMEOUT 测试属性或 --timeout 标志指定,则为每个测试的默认超时时间。

要向 CDash 报告额外的测试值,请参阅 额外测试测量

CTest 覆盖率步骤

CTest 脚本 中,ctest_coverage() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

配置设置包括

CoverageCommand

用于执行软件覆盖率分析的命令行工具。它将在 BuildDirectory 设置指定的位置执行。

CoverageExtraFlags

指定传给 CoverageCommand 工具的命令行选项。

这些选项是传给 CoverageCommand 的第一批参数。

CTest 内存检查步骤

CTest 脚本 中,ctest_memcheck() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

配置设置包括

MemoryCheckCommand

用于执行动态分析的命令行工具。测试命令行将通过此工具启动。

MemoryCheckCommandOptions

指定传给 MemoryCheckCommand 工具的命令行选项。它们将被放置在测试命令行之前。

MemoryCheckType

指定要执行的内存检查类型。

MemoryCheckSanitizerOptions

在使用已启用清理程序 (sanitize) 的构建运行时,指定传给清理程序的选项。

MemoryCheckSuppressionFile

指定一个包含 MemoryCheckCommand 工具抑制规则的文件。它将连同适合该工具的选项一起传递。

其他配置设置包括

BoundsCheckerCommand

指定已知在命令行上与 Bounds Checker 兼容的 MemoryCheckCommand

PurifyCommand

指定已知在命令行上与 Purify 兼容的 MemoryCheckCommand

ValgrindCommand

指定已知在命令行上与 Valgrind 兼容的 MemoryCheckCommand

ValgrindCommandOptions

指定传给 ValgrindCommand 工具的命令行选项。它们将被放置在测试命令行之前。

DrMemoryCommand

指定已知在命令行上与 DrMemory 兼容的 MemoryCheckCommand

DrMemoryCommandOptions

指定传给 DrMemoryCommand 工具的命令行选项。它们将被放置在测试命令行之前。

CudaSanitizerCommand

指定已知在命令行上与 cuda-memcheck 或 compute-sanitizer 兼容的 MemoryCheckCommand

CudaSanitizerCommandOptions

指定传给 CudaSanitizerCommand 工具的命令行选项。它们将被放置在测试命令行之前。

CTest 提交步骤

CTest 脚本 中,ctest_submit() 命令用于运行此步骤。该命令的参数可以指定某些步骤设置。

配置设置包括

BuildName

用短字符串描述仪表板客户端平台。(操作系统、编译器等)

CDashVersion

遗留选项。未使用。

  • CTest 脚本 变量:无,从服务器检测

  • CTest 模块变量:CTEST_CDASH_VERSION

CTestSubmitRetryCount

指定网络故障时重试提交的次数。

CTestSubmitRetryDelay

指定网络故障时重试提交前的延迟时间。

CurlOptions

3.30 版本弃用:改用 TLSVerify

指定一个分号分隔的选项列表,用于控制 CTest 内部用于连接服务器的 Curl 库。

可能的选项包括

CURLOPT_SSL_VERIFYPEER_OFF

禁用 CURLOPT_SSL_VERIFYPEER curl 选项。

CURLOPT_SSL_VERIFYHOST_OFF

禁用 CURLOPT_SSL_VERIFYHOST curl 选项。

DropLocation

旧选项。当未设置 SubmitURL 时,它将根据 DropMethod, DropSiteUser, DropSitePassword, DropSiteDropLocation 构建。

DropMethod

旧选项。当未设置 SubmitURL 时,它将根据 DropMethod, DropSiteUser, DropSitePassword, DropSiteDropLocation 构建。

DropSite

旧选项。当未设置 SubmitURL 时,它将根据 DropMethod, DropSiteUser, DropSitePassword, DropSiteDropLocation 构建。

DropSitePassword

旧选项。当未设置 SubmitURL 时,它将根据 DropMethod, DropSiteUser, DropSitePassword, DropSiteDropLocation 构建。

DropSiteUser

旧选项。当未设置 SubmitURL 时,它将根据 DropMethod, DropSiteUser, DropSitePassword, DropSiteDropLocation 构建。

IsCDash

遗留选项。未使用。

ScpCommand

遗留选项。未使用。

Site

用短字符串描述仪表板客户端主机站点。(主机名、域名等)

SubmitURL

要将提交发送到的仪表板服务器的 httphttps URL。

SubmitInactivityTimeout

等待提交的时间,如果在此期间未完成,则取消提交。指定零值以禁用超时。

TLSVersion

3.30 版本新增。

指定通过 https:// URL 提交到仪表板时允许的最低 TLS 版本。

版本 3.31 中有更改: 默认值为 TLS 1.2。此前,默认情况下没有强制执行最低版本。

TLSVerify

3.30 版本新增。

指定一个布尔值,指示在通过 https:// URL 提交到仪表板时是否验证服务器证书。

3.31 版本更改:默认为开启。此前默认为关闭。用户可以设置 CMAKE_TLS_VERIFY 环境变量为 0 来恢复旧的默认值。

TriggerSite

遗留选项。未使用。

显示为 JSON 对象模型

3.14 版新增。

当给定 --show-only=json-v1 命令行选项时,测试信息以 JSON 格式输出。JSON 对象模型的 1.0 版本定义如下

种类

字符串 "ctestInfo"。

版本

一个指定版本组件的 JSON 对象。其成员包括

主要版本

一个指定 JSON 对象模型主版本组件的正整数。

次要版本

一个指定 JSON 对象模型次版本组件的非负整数。

backtraceGraph

表示回溯信息的 JSON 对象,具有以下成员

commands

命令名称列表。

files

文件名列表。

nodes

包含以下成员的节点 JSON 对象列表

命令

当节点表示文件内的命令调用时出现的可选成员。其值是一个无符号整数,作为对 backtraceGraphcommands 成员的 0 索引访问。

file

一个基于 0 的无符号整数索引,指向 backtraceGraphfiles 成员。

当节点代表文件中的一行时存在的一个可选成员。其值是一个基于 1 的无符号整数,表示添加回溯(backtrace)信息所在的行号。

parent

当节点不是调用栈的底部时存在的一个可选成员。其值是一个基于 0 的无符号整数索引,指向 backtraceGraphnodes 成员,代表图中的父节点。

tests

一个列出每个测试信息的 JSON 数组。每个条目都是一个包含以下成员的 JSON 对象:

名称

测试名称。不能为空。

config

指定测试运行配置的可选字段。此值始终与 ctest 命令行上指定的 -C 选项匹配。如果未给定该选项,则该字段不会出现。

命令

可选数组,其中第一个元素是测试命令,其余元素是命令参数。通常情况下,此字段应存在且非空,但在涉及生成器表达式的某些边缘情况下,测试可能没有命令,因此该字段可能缺失。

回溯

指向 backtraceGraphnodes 成员的索引。

属性

测试属性的可选数组。每个数组项都是一个包含以下成员的 JSON 对象:

名称

测试属性的名称。不能为空。

value

属性值,可以是字符串、数字、布尔值或字符串数组。

4.1 版本新增:JSON 输出格式通过 此 JSON 模式 以机器可读的形式描述。

资源分配 (Resource Allocation)

CTest 提供了一种机制,允许测试以细粒度方式指定它们所需的资源,并允许用户指定运行机器上可用的资源。这使得 CTest 能够在内部跟踪哪些资源正在使用中,哪些是空闲的,从而以防止测试试图申请不可用资源的方式调度测试。

当使用资源分配功能时,CTest 不会超额预订资源。例如,如果某个资源有 8 个插槽,CTest 不会运行总共同时使用超过 8 个插槽的测试。即使使用了很高的 -j 参数,如果这些测试都使用了同一资源的一些插槽,这也会产生限制任何给定时间内可运行测试数量的效果。此外,这意味着单个测试如果使用的资源超过了机器上的可用资源,则根本不会运行(并被报告为 Not Run)。

此功能的一个常见用例是需要使用 GPU 的测试。多个测试可以同时从 GPU 分配内存,但如果太多测试同时尝试这样做,其中一些将分配失败,导致测试失败,即使如果它们拥有所需内存,测试本可以成功。通过使用资源分配功能,每个测试都可以指定它需要多少 GPU 内存,从而允许 CTest 以这样一种方式调度测试:即同时运行这些测试中的几个也不会耗尽 GPU 的内存池。

请注意,CTest 没有 GPU 是什么或它有多少内存的概念。它没有任何方式与 GPU 通信以检索此信息或执行任何内存管理,尽管项目可以定义一个提供测试机器详细信息的测试(参见 动态生成的资源规范文件)。

CTest 跟踪一个抽象资源类型列表,每种类型都有一定数量的插槽供测试使用。每个测试指定它从特定资源需要的插槽数量,然后 CTest 以防止正在使用的插槽总数超过列出的容量的方式调度它们。当执行测试并将资源的插槽分配给该测试时,测试可以假定在测试进程期间它们拥有这些插槽的独占使用权。

CTest 资源分配功能至少包含两个输入:

当 CTest 运行测试时,分配给该测试的资源以一组 环境变量 的形式传递(如下所述)。使用此信息来决定连接到哪个资源由测试编写者决定。

RESOURCE_GROUPS 属性告诉 CTest 测试期望以对测试有意义的方式使用的资源分组。测试本身必须读取 环境变量 以确定已为每个组分配了哪些资源。例如,每个组可能对应于测试在执行时将生成的进程。

请注意,即使测试指定了 RESOURCE_GROUPS 属性,如果用户没有传递资源规范文件,测试仍然可能在没有任何资源分配(且没有相应的 环境变量)的情况下运行。通过 --resource-spec-file 命令行参数或 ctest_test()RESOURCE_SPEC_FILE 参数传递此文件是激活资源分配功能的操作。测试应检查 CTEST_RESOURCE_GROUP_COUNT 环境变量以确定是否激活了资源分配。只有在激活资源分配时,此变量才会被定义。如果未激活资源分配,则即使父 ctest 进程中存在该变量,CTEST_RESOURCE_GROUP_COUNT 变量也不会存在。如果测试绝对必须具有资源分配,那么它可以返回失败的退出码,或使用 SKIP_RETURN_CODESKIP_REGULAR_EXPRESSION 属性来指示跳过测试。

资源规范文件

资源规范文件是一个 JSON 文件,它以多种方式之一传递给 CTest。它可以在命令行上使用 ctest --resource-spec-file 选项指定,也可以使用 ctest_test()RESOURCE_SPEC_FILE 参数给出,或者可以作为测试执行的一部分动态生成(参见 动态生成的资源规范文件)。

如果使用了仪表板脚本且未指定 RESOURCE_SPEC_FILE,则改用仪表板脚本中 CTEST_RESOURCE_SPEC_FILE 的值。如果未指定 --resource-spec-fileRESOURCE_SPEC_FILE 以及仪表板脚本中的 CTEST_RESOURCE_SPEC_FILE,则改用 CMake 构建中 CTEST_RESOURCE_SPEC_FILE 的值。如果这些均未指定,则不使用资源规范文件。

资源规范文件必须是一个 JSON 对象。本文档中的所有示例均假设采用以下资源规范文件:

{
  "version": {
    "major": 1,
    "minor": 0
  },
  "local": [
    {
      "gpus": [
        {
          "id": "0",
          "slots": 2
        },
        {
          "id": "1",
          "slots": 4
        },
        {
          "id": "2",
          "slots": 2
        },
        {
          "id": "3"
        }
      ],
      "crypto_chips": [
        {
          "id": "card0",
          "slots": 4
        }
      ]
    }
  ]
}

成员是

版本

包含 major 整数域和 minor 整数域的对象。目前,唯一支持的版本是主版本 1,次版本 0。任何其他值均为错误。

local

系统上存在的资源集的 JSON 数组。目前,该数组限制为大小为 1。

每个数组元素都是一个 JSON 对象,其成员名称等于所需的资源类型,例如 gpus。这些名称必须以小写字母或下划线开头,后续字符可以是小写字母、数字或下划线。不允许使用大写字母,因为某些平台具有大小写不敏感的环境变量。有关更多信息,请参阅下方的 环境变量 部分。建议资源类型名称应为名词的复数形式,例如 gpuscrypto_chips(而不是 gpucrypto_chip)。

请注意,名称 gpuscrypto_chips 仅为示例,CTest 不会以任何方式解释它们。您可以自由创建任何想要满足自身需求的资源类型。

每个资源类型的值是一个由 JSON 对象组成的 JSON 数组,每个对象描述指定资源的特定实例。这些对象具有以下成员:

id

由资源标识符组成的字符串。标识符中的每个字符可以是小写字母、数字或下划线。不允许使用大写字母。

标识符在资源类型内必须是唯一的。但是,它们不必在资源类型之间保持唯一。例如,拥有一个名为 0gpus 资源和一个名为 0crypto_chips 资源是有效的,但不能有两个都名为 0gpus 资源。

请注意,ID 0123card0 仅为示例,CTest 不会以任何方式解释它们。您可以自由创建任何想要满足自身需求的 ID。

slots

一个可选的无符号数字,指定资源上可用的插槽数量。例如,这可以是 GPU 上的 RAM 兆字节数,或者是加密芯片上可用的加密单元。如果未指定 slots,则假定默认值为 1

在上面的示例文件中,有四个 GPU,ID 为 0 到 3。GPU 0 有 2 个插槽,GPU 1 有 4 个,GPU 2 有 2 个,GPU 3 默认为 1 个插槽。还有一个拥有 4 个插槽的加密芯片。

RESOURCE_GROUPS 属性

有关此属性的说明,请参阅 RESOURCE_GROUPS

环境变量

一旦 CTest 决定将哪些资源分配给测试,它就会将此信息作为一系列环境变量传递给测试可执行文件。对于下面的每个示例,我们将假设所讨论的测试具有 2,gpus:2;gpus:4,gpus:1,crypto_chips:2RESOURCE_GROUPS 属性。

以下变量被传递给测试进程:

CTEST_RESOURCE_GROUP_COUNT

RESOURCE_GROUPS 属性指定的总组数。例如:

  • CTEST_RESOURCE_GROUP_COUNT=3

此变量仅在 ctest(1) 被赋予 --resource-spec-file,或者 ctest_test() 被赋予 RESOURCE_SPEC_FILE 时才会被定义。如果未给定资源规范文件,则不会定义此变量。

CTEST_RESOURCE_GROUP_<num>

分配给每个组的资源类型列表,每个项目用逗号分隔。<num> 是从 0 到 CTEST_RESOURCE_GROUP_COUNT 减 1 的数字。CTEST_RESOURCE_GROUP_<num> 为此范围内的每个 <num> 定义。例如:

  • CTEST_RESOURCE_GROUP_0=gpus

  • CTEST_RESOURCE_GROUP_1=gpus

  • CTEST_RESOURCE_GROUP_2=crypto_chips,gpus

CTEST_RESOURCE_GROUP_<num>_<resource-type>

分配给每个组的资源 ID 列表以及每个资源类型分配的插槽数量。此变量由一系列对组成,每对用分号分隔,对中的两个项目用逗号分隔。每对中的第一项是 id: 后跟 <resource-type> 类型资源的 ID,第二项是 slots: 后跟分配给给定组的该资源插槽数量。例如:

  • CTEST_RESOURCE_GROUP_0_GPUS=id:0,slots:2

  • CTEST_RESOURCE_GROUP_1_GPUS=id:2,slots:2

  • CTEST_RESOURCE_GROUP_2_GPUS=id:1,slots:4;id:3,slots:1

  • CTEST_RESOURCE_GROUP_2_CRYPTO_CHIPS=id:card0,slots:2

在此示例中,组 0 从 GPU 0 获得 2 个插槽,组 1 从 GPU 2 获得 2 个插槽,组 2 从 GPU 1 获得 4 个插槽,从 GPU 3 获得 1 个插槽,从加密芯片 card0 获得 2 个插槽。

<num> 是从 0 到 CTEST_RESOURCE_GROUP_COUNT 减 1 的数字。<resource-type> 是资源类型的名称,转换为大写。CTEST_RESOURCE_GROUP_<num>_<resource-type> 是为上述范围内的每个 <num>CTEST_RESOURCE_GROUP_<num> 中列出的每个资源类型的乘积而定义的。

由于某些平台的环境变量名称不区分大小写,资源类型名称在不区分大小写的环境中不得冲突。因此,为了简单起见,所有资源类型必须在 资源规范文件RESOURCE_GROUPS 属性中全部以小写形式列出,并且它们在 CTEST_RESOURCE_GROUP_<num>_<resource-type> 环境变量中会转换为全部大写。

动态生成的资源规范文件

版本 3.28 新增。

项目可以选择指定一个测试,该测试将用于动态生成 CTest 将用于调度使用资源的测试的资源规范文件。生成该文件的测试必须设置 GENERATED_RESOURCE_SPEC_FILE 属性,并且在其 FIXTURES_SETUP 属性中必须恰好有一个装置(fixture)。该装置被 CTest 视为具有特殊含义:它是生成资源规范文件的装置。装置可以使用任何名称。如果存在这样的装置,所有设置了 RESOURCE_GROUPS 的测试必须在其 FIXTURES_REQUIRED 中包含该装置,且不能使用 --resource-spec-file 参数或 CTEST_RESOURCE_SPEC_FILE 变量来指定资源规范文件。

作业服务器集成

在版本 3.29 中添加。

在 POSIX 系统上,当在 作业服务器 (Job Server) 的上下文中运行时,CTest 会共享其作业插槽。这独立于 PROCESSORS 测试属性,该属性仍会计入 CTest 的 -j 并行级别。CTest 在运行每个测试之前从作业服务器获取恰好一个令牌,并在测试完成时将其返回。

例如,考虑以下 Makefile

test:
	+ctest -j 8

当通过 make -j 2 test 调用时,ctest 会连接到作业服务器,为每个测试获取一个令牌,并最多同时运行 2 个测试。

在 Windows 系统上,尚未实现作业服务器集成。

另请参阅

以下资源可用于获取使用 CMake 的帮助

主页

https://cmake.com.cn

学习 CMake 的主要起点。

在线文档和社区资源

https://cmake.com.cn/documentation

此网页上可以找到可用文档和社区资源的链接。

论坛

https://discourse.cmake.org

论坛用于讨论和提问 CMake。