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>]
描述¶
The ctest 可执行文件是 CMake 测试驱动程序。为使用 enable_testing() 和 add_test() 命令生成的构建树支持测试。该程序将运行测试并报告结果。
运行测试¶
- --preset <preset>, --preset=<preset>¶
使用测试预设指定测试选项。项目二进制目录将从
configurePreset键推断。当前工作目录必须包含 CMake 预设文件。有关更多详细信息,请参阅preset。
- --list-presets¶
列出可用的测试预设。当前工作目录必须包含 CMake 预设文件。
- -C <cfg>, --build-config <cfg>¶
选择要测试的配置。
某些 CMake 生成的构建树可以在同一树中具有多个构建配置。此选项可用于指定应测试哪一个。示例配置为
Debug和Release。
- --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,使其不会自动添加任何测试到测试集中。如果测试集中某个测试需要特定的 fixture,该 fixture 的设置和清理测试通常会自动添加到测试集中。此选项阻止添加匹配
<regex>的 fixture 的设置或清理测试。请注意,所有其他 fixture 行为都保留,包括测试依赖关系和跳过具有 fixture 设置测试失败的测试。
- -I [Start,End,Stride,test#,test#|Test file], --tests-information¶
按编号运行特定数量的测试。
此选项使 CTest 从编号
Start开始,在编号End结束,并以Stride递增的方式运行测试。任何在Stride之后的附加编号都被视为单独的测试编号。Start、End或Stride可以为空。可选地,可以提供一个文件,其中包含与命令行相同的语法。
- --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>¶
- --max-width <width>¶
设置测试名称输出的最大宽度。
设置每个测试名称在输出中显示的最大宽度。这允许用户加宽输出以避免截断测试名称,这可能会非常烦人。
- --interactive-debug-mode <0|1>¶
禁用(
0)或启用(1)交互式调试模式。此选项使 CTest 以交互模式或非交互模式运行测试。在仪表板模式(
Experimental、Nightly、Continuous)下,默认为非交互模式。在非交互模式下,将设置环境变量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(默认)、middle或head。
- --overwrite¶
覆盖 CTest 配置选项。
默认情况下,CTest 使用配置文件中的配置选项。此选项将覆盖配置选项。
- --force-new-ctest-process¶
已忽略。此选项曾经禁用一项现已移除的、用于测试运行
ctest本身时的优化。
- --schedule-random¶
使用随机顺序调度测试。
此选项将以随机顺序运行测试。它通常用于检测测试套件中的隐式依赖关系。
- --schedule-random-seed¶
在 4.1 版本中新增。
覆盖随机顺序种子
此选项用于通过
--schedule-random来重现因随机执行顺序而导致的故障。
- --submit-index¶
用于旧 Dart2 仪表板服务器功能的旧版选项。请勿使用。
- --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来设置。
查看帮助¶
要打印版本详细信息或 CMake 文档中的选定页面,请使用以下选项之一。
- -version [<file>], --version [<file>], /V [<file>]¶
显示程序名称/版本横幅并退出。如果给定,输出将打印到指定
<file>。
- -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 具有标签 tuesday 和 production
test2 具有标签 tuesday 和 test
test3 具有标签 wednesday 和 production
test4 具有标签 wednesday
test5 具有标签 friday 和 test
运行 ctest 并使用 -L tuesday -L test 将选择 test2,因为它同时具有这两个标签。使用 -L test 运行 CTest 将选择 test2 和 test5,因为它们都具有与该正则表达式匹配的标签。
由于匹配是通过正则表达式进行的,因此请注意,使用 -L es 运行 CTest 将匹配所有五个测试。要同时选择 tuesday 和 wednesday 测试,请使用匹配其中任何一个的单个正则表达式,例如 -L "tue|wed"。
标签和子项目摘要¶
CTest 为运行的测试关联的每个 LABEL 和子项目打印计时摘要信息。标签时间摘要不包括映射到子项目的标签。
Added in version 3.22: 在测试执行期间动态添加的标签也会在计时摘要中报告。请参阅 附加标签。
当设置 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测试的 CTestPROCESSORS属性值num_tests[j]:与j标签或子项目关联的测试数量total:运行至少一个测试的标签或子项目的总数
因此,每个标签或子项目的加权时间摘要代表了 CTest 运行每个标签或子项目测试所花费的时间,并与其它标签或子项目进行比较,可以很好地表示每个标签或子项目测试的总开销。
例如,如果 SubprojectA 显示 100 sec*proc,而 SubprojectB 显示 10 sec*proc,那么 CTest 分配给运行 SubprojectA 测试的时间大约是 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¶
用于确定应使用哪个配置的示例可执行文件。例如:
Debug、Release等。
- --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>可以是Experimental、Nightly和Continuous,而<Test>可以是Start、Update、Configure、Build、Test、Coverage和Submit。如果
<dashboard>不是已识别的<Mode><Test>值之一,则它将被视为变量定义(请参阅下面的 dashboard-options)。
- -M <model>, --test-model <model>¶
设置仪表板的模型。
此选项指示 CTest 充当 CDash 客户端,其中
<model>可以是Experimental、Nightly和Continuous。结合使用-M和-T类似于-D。
- -T <action>, --test-action <action>¶
设置要执行的仪表板操作。
此选项指示 CTest 充当 CDash 客户端并执行某些操作,例如
start、build、test等。有关操作的完整列表,请参阅 仪表板客户端步骤。结合使用-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>¶
在提交时添加一个 notes 文件。
此选项指示 CTest 在提交仪表板时包含一个 notes 文件。
- --tomorrow-tag¶
Nightly或Experimental使用下一天的标签开始。这对于构建不能在一天内完成的情况很有用。
- --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 Start Step 部分。
Update从版本控制存储库更新源树。记录旧版本和新版本以及更新的源文件列表。请参阅下面的 CTest Update Step 部分。
Configure通过在构建树中运行命令来配置软件。记录配置输出日志。请参阅下面的 CTest Configure Step 部分。
Build通过在构建树中运行命令来构建软件。记录构建输出日志并检测警告和错误。请参阅下面的 CTest Build Step 部分。
Test通过从构建树加载
CTestTestfile.cmake并执行定义的测试来测试软件。记录每个测试的输出和结果。请参阅下面的 CTest Test Step 部分。Coverage通过运行覆盖率分析工具并记录其输出来计算源代码覆盖率。请参阅下面的 CTest Coverage Step 部分。
MemCheck通过内存检查工具运行软件测试套件。记录工具报告的测试输出、结果和问题。请参阅下面的 CTest MemCheck Step 部分。
Submit将从其他测试步骤记录的结果提交到软件质量仪表板服务器。请参阅下面的 CTest Submit Step 部分。
仪表板客户端模式¶
CTest 定义了三种作为仪表板客户端的运行模式。
Nightly此模式旨在每天调用一次,通常在夜间。默认情况下,它启用
Start、Update、Configure、Build、Test、Coverage和Submit步骤。即使Update步骤报告源树没有更改,选定的步骤仍会运行。Continuous此模式旨在全天反复调用。默认情况下,它启用
Start、Update、Configure、Build、Test、Coverage和Submit步骤,但在Update步骤报告源树没有更改后退出。Experimental此模式旨在由开发人员调用以测试本地更改。默认情况下,它启用
Start、Configure、Build、Test、Coverage和Submit步骤。
通过 CTest 命令行进行仪表板客户端¶
CTest 可以对已生成的构建树执行测试。将当前工作目录设置为构建树,然后运行 ctest 命令,并使用以下签名之一:
ctest -D <mode>[<step>]
ctest -M <mode> [-T <step>]...
The <mode> 必须是上述 Dashboard Client Modes 之一,并且每个 <step> 必须是上述 Dashboard Client Steps 之一。
CTest 从构建树中的一个名为 CTestConfiguration.ini 或 DartConfiguration.tcl(名称为历史原因)的文件中读取 Dashboard Client Configuration 设置。文件格式如下:
# 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>
The <script> 文件必须调用 CTest Commands 命令来显式运行测试步骤,具体说明如下。命令从其参数中获取 Dashboard Client Configuration 设置,或从脚本中设置的变量中获取。
仪表板客户端配置¶
The Dashboard Client Steps may be configured by named settings as documented in the following sections.
CTest Start Step¶
Start a new dashboard submission to be composed of results recorded by the following steps.
在 CTest Script 中,ctest_start() 命令运行此步骤。命令的参数可以指定此步骤的一些设置。该命令首先运行 CTEST_CHECKOUT_COMMAND 变量指定的命令(如果已设置),以初始化源目录。
Configuration settings include
BuildDirectoryThe full path to the project build tree.
CTest Script variable:
CTEST_BINARY_DIRECTORYCTestmodule variable:PROJECT_BINARY_DIR
SourceDirectoryThe full path to the project source tree.
CTest Script variable:
CTEST_SOURCE_DIRECTORYCTestmodule variable:PROJECT_SOURCE_DIR
CTest Update Step¶
在 CTest Script 中,ctest_update() 命令运行此步骤。命令的参数可以指定此步骤的一些设置。
Configuration settings to specify the version control tool include
BZRCommandbzrcommand-line tool to use if source tree is managed by Bazaar.CTest Script variable:
CTEST_BZR_COMMANDCTestmodule variable: none
BZRUpdateOptionsCommand-line options to the
BZRCommandwhen updating the source.CTest Script variable:
CTEST_BZR_UPDATE_OPTIONSCTestmodule variable: none
CVSCommandcvscommand-line tool to use if source tree is managed by CVS.CTest Script variable:
CTEST_CVS_COMMANDCTestmodule variable:CVSCOMMAND
CVSUpdateOptionsCommand-line options to the
CVSCommandwhen updating the source.CTest Script variable:
CTEST_CVS_UPDATE_OPTIONSCTestmodule variable:CVS_UPDATE_OPTIONS
GITCommandgitcommand-line tool to use if source tree is managed by Git.CTest Script variable:
CTEST_GIT_COMMANDCTestmodule variable:GITCOMMAND
The source tree is updated by
git fetchfollowed bygit reset --hardto theFETCH_HEAD. The result is the same asgit pullexcept that any local modifications are overwritten. UseGITUpdateCustomto specify a different approach.GITInitSubmodulesIf set, CTest will update the repository's submodules before updating.
CTest Script variable:
CTEST_GIT_INIT_SUBMODULESCTestmodule variable:CTEST_GIT_INIT_SUBMODULES
GITUpdateCustomSpecify a custom command line (as a semicolon-separated list) to run in the source tree (Git work tree) to update it instead of running the
GITCommand.CTest Script variable:
CTEST_GIT_UPDATE_CUSTOMCTestmodule variable:CTEST_GIT_UPDATE_CUSTOM
GITUpdateOptionsCommand-line options to the
GITCommandwhen updating the source.CTest Script variable:
CTEST_GIT_UPDATE_OPTIONSCTestmodule variable:GIT_UPDATE_OPTIONS
HGCommandhgcommand-line tool to use if source tree is managed by Mercurial.CTest Script variable:
CTEST_HG_COMMANDCTestmodule variable: none
HGUpdateOptionsCommand-line options to the
HGCommandwhen updating the source.CTest Script variable:
CTEST_HG_UPDATE_OPTIONSCTestmodule variable: none
P4ClientValue of the
-coption to theP4Command.CTest Script variable:
CTEST_P4_CLIENTCTestmodule variable:CTEST_P4_CLIENT
P4Commandp4command-line tool to use if source tree is managed by Perforce.CTest Script variable:
CTEST_P4_COMMANDCTestmodule variable:P4COMMAND
P4OptionsCommand-line options to the
P4Commandfor all invocations.CTest Script variable:
CTEST_P4_OPTIONSCTestmodule variable:CTEST_P4_OPTIONS
P4UpdateCustomSpecify a custom command line (as a semicolon-separated list) to run in the source tree (Perforce tree) to update it instead of running the
P4Command.CTest Script variable: none
CTestmodule variable:CTEST_P4_UPDATE_CUSTOM
P4UpdateOptionsCommand-line options to the
P4Commandwhen updating the source.CTest Script variable:
CTEST_P4_UPDATE_OPTIONSCTestmodule variable:CTEST_P4_UPDATE_OPTIONS
SVNCommandsvncommand-line tool to use if source tree is managed by Subversion.CTest Script variable:
CTEST_SVN_COMMANDCTestmodule variable:SVNCOMMAND
SVNOptionsCommand-line options to the
SVNCommandfor all invocations.CTest Script variable:
CTEST_SVN_OPTIONSCTestmodule variable:CTEST_SVN_OPTIONS
SVNUpdateOptionsCommand-line options to the
SVNCommandwhen updating the source.CTest Script variable:
CTEST_SVN_UPDATE_OPTIONSCTestmodule variable:SVN_UPDATE_OPTIONS
UpdateCommandSpecify the version-control command-line tool to use without detecting the VCS that manages the source tree.
CTest Script variable:
CTEST_UPDATE_COMMANDCTestmodule variable:<VCS>COMMANDwhenUPDATE_TYPEis<vcs>, elseUPDATE_COMMAND
UpdateOptionsCommand-line options to the
UpdateCommand.CTest Script variable:
CTEST_UPDATE_OPTIONSCTestmodule variable:<VCS>_UPDATE_OPTIONSwhenUPDATE_TYPEis<vcs>, elseUPDATE_OPTIONS
UpdateTypeSpecify the version-control system that manages the source tree if it cannot be detected automatically. The value may be
bzr,cvs,git,hg,p4, orsvn.CTest Script variable: none, detected from source tree
CTestmodule variable:UPDATE_TYPEif set, elseCTEST_UPDATE_TYPE
UpdateVersionOnlySpecify that you want the version control update command to only discover the current version that is checked out, and not to update to a different version.
CTest Script variable:
CTEST_UPDATE_VERSION_ONLY
UpdateVersionOverrideSpecify the current version of your source tree.
When this variable is set to a non-empty string, CTest will report the value you specified rather than using the update command to discover the current version that is checked out. Use of this variable supersedes
UpdateVersionOnly. LikeUpdateVersionOnly, using this variable tells CTest not to update the source tree to a different version.CTest Script variable:
CTEST_UPDATE_VERSION_OVERRIDE
Additional configuration settings include
NightlyStartTimeIn the
Nightlydashboard mode, specify the "nightly start time". With centralized version control systems (cvsandsvn), theUpdatestep checks out the version of the software as of this time so that multiple clients choose a common version to test. This is not well-defined in distributed version-control systems so the setting is ignored.CTest Script variable:
CTEST_NIGHTLY_START_TIMECTestmodule variable:NIGHTLY_START_TIMEif set, elseCTEST_NIGHTLY_START_TIME
CTest Configure Step¶
In a CTest Script, the ctest_configure() command runs this step. Arguments to the command may specify some of the step settings.
Configuration settings include
ConfigureCommandCommand-line to launch the software configuration process. It will be executed in the location specified by the
BuildDirectorysetting.CTest Script variable:
CTEST_CONFIGURE_COMMANDCTestmodule variable:CMAKE_COMMANDfollowed byPROJECT_SOURCE_DIR
LabelsForSubprojectsSpecify a semicolon-separated list of labels that will be treated as subprojects. This mapping will be passed on to CDash when configure, test or build results are submitted.
CTest Script variable:
CTEST_LABELS_FOR_SUBPROJECTSCTestmodule variable:CTEST_LABELS_FOR_SUBPROJECTS
请参阅 标签和子项目摘要。
CTest Build Step¶
In a CTest Script, the ctest_build() command runs this step. Arguments to the command may specify some of the step settings.
Configuration settings include
DefaultCTestConfigurationTypeWhen the build system to be launched allows build-time selection of the configuration (e.g.
Debug,Release), this specifies the default configuration to be built when no-Coption is given to the ctest command. The value will be substituted into the value ofMakeCommandto replace the literal string${CTEST_CONFIGURATION_TYPE}if it appears.CTest Script variable:
CTEST_CONFIGURATION_TYPECTestmodule variable:DEFAULT_CTEST_CONFIGURATION_TYPE, initialized by theCMAKE_CONFIG_TYPEenvironment variable
LabelsForSubprojectsSpecify a semicolon-separated list of labels that will be treated as subprojects. This mapping will be passed on to CDash when configure, test or build results are submitted.
CTest Script variable:
CTEST_LABELS_FOR_SUBPROJECTSCTestmodule variable:CTEST_LABELS_FOR_SUBPROJECTS
请参阅 标签和子项目摘要。
MakeCommandCommand-line to launch the software build process. It will be executed in the location specified by the
BuildDirectorysetting.CTest Script variable:
CTEST_BUILD_COMMANDCTestmodule variable:MAKECOMMAND, initialized by thebuild_command()command
UseLaunchersFor build trees generated by CMake using one of the Makefile Generators or the
Ninjagenerator, specify whether theCTEST_USE_LAUNCHERSfeature is enabled by theCTestUseLaunchersmodule (also included by theCTestmodule). When enabled, the generated build system wraps each invocation of the compiler, linker, or custom command line with a "launcher" that communicates with CTest via environment variables and files to report granular build warning and error information. Otherwise, CTest must "scrape" the build output log for diagnostics.CTest Script variable:
CTEST_USE_LAUNCHERSCTestmodule variable:CTEST_USE_LAUNCHERS
CTest Test Step¶
In a CTest Script, the ctest_test() command runs this step. Arguments to the command may specify some of the step settings.
Configuration settings include
ResourceSpecFileSpecify a resource specification file.
CTest Script variable:
CTEST_RESOURCE_SPEC_FILECTestmodule variable:CTEST_RESOURCE_SPEC_FILE
See Resource Allocation for more information.
LabelsForSubprojectsSpecify a semicolon-separated list of labels that will be treated as subprojects. This mapping will be passed on to CDash when configure, test or build results are submitted.
CTest Script variable:
CTEST_LABELS_FOR_SUBPROJECTSCTestmodule variable:CTEST_LABELS_FOR_SUBPROJECTS
请参阅 标签和子项目摘要。
TestLoad在并行运行测试时(例如使用
-j),尽量避免在 CPU 负载可能超过给定阈值时启动测试。CTest Script variable:
CTEST_TEST_LOADCTestmodule variable:CTEST_TEST_LOAD
TimeOutThe default timeout for each test if not specified by the
TIMEOUTtest property or the--timeoutflag.CTest Script variable:
CTEST_TEST_TIMEOUTCTestmodule variable:DART_TESTING_TIMEOUT
To report extra test values to CDash, see Additional Test Measurements.
CTest Coverage Step¶
In a CTest Script, the ctest_coverage() command runs this step. Arguments to the command may specify some of the step settings.
Configuration settings include
CoverageCommandCommand-line tool to perform software coverage analysis. It will be executed in the location specified by the
BuildDirectorysetting.CTest Script variable:
CTEST_COVERAGE_COMMANDCTestmodule variable:COVERAGE_COMMAND
CoverageExtraFlagsSpecify command-line options to the
CoverageCommandtool.CTest Script variable:
CTEST_COVERAGE_EXTRA_FLAGSCTestmodule variable:COVERAGE_EXTRA_FLAGS
These options are the first arguments passed to
CoverageCommand.
CTest MemCheck Step¶
In a CTest Script, the ctest_memcheck() command runs this step. Arguments to the command may specify some of the step settings.
Configuration settings include
MemoryCheckCommandCommand-line tool to perform dynamic analysis. Test command lines will be launched through this tool.
CTest Script variable:
CTEST_MEMORYCHECK_COMMANDCTestmodule variable:MEMORYCHECK_COMMAND
MemoryCheckCommandOptionsSpecify command-line options to the
MemoryCheckCommandtool. They will be placed prior to the test command line.CTestmodule variable:MEMORYCHECK_COMMAND_OPTIONS
MemoryCheckTypeSpecify the type of memory checking to perform.
CTest Script variable:
CTEST_MEMORYCHECK_TYPECTestmodule variable:MEMORYCHECK_TYPE
MemoryCheckSanitizerOptionsSpecify options to sanitizers when running with a sanitize-enabled build.
CTestmodule variable:MEMORYCHECK_SANITIZER_OPTIONS
MemoryCheckSuppressionFileSpecify a file containing suppression rules for the
MemoryCheckCommandtool. It will be passed with options appropriate to the tool.CTestmodule variable:MEMORYCHECK_SUPPRESSIONS_FILE
Additional configuration settings include
BoundsCheckerCommandSpecify a
MemoryCheckCommandthat is known to be command-line compatible with Bounds Checker.CTest Script variable: none
CTestmodule variable: none
PurifyCommandSpecify a
MemoryCheckCommandthat is known to be command-line compatible with Purify.CTest Script variable: none
CTestmodule variable:PURIFYCOMMAND
ValgrindCommandSpecify a
MemoryCheckCommandthat is known to be command-line compatible with Valgrind.CTest Script variable: none
CTestmodule variable:VALGRIND_COMMAND
ValgrindCommandOptionsSpecify command-line options to the
ValgrindCommandtool. They will be placed prior to the test command line.CTest Script variable: none
CTestmodule variable:VALGRIND_COMMAND_OPTIONS
DrMemoryCommandSpecify a
MemoryCheckCommandthat is known to be a command-line compatible with DrMemory.CTest Script variable: none
CTestmodule variable:DRMEMORY_COMMAND
DrMemoryCommandOptionsSpecify command-line options to the
DrMemoryCommandtool. They will be placed prior to the test command line.CTest Script variable: none
CTestmodule variable:DRMEMORY_COMMAND_OPTIONS
CudaSanitizerCommandSpecify a
MemoryCheckCommandthat is known to be a command-line compatible with cuda-memcheck or compute-sanitizer.CTest Script variable: none
CTestmodule variable:CUDA_SANITIZER_COMMAND
CudaSanitizerCommandOptionsSpecify command-line options to the
CudaSanitizerCommandtool. They will be placed prior to the test command line.CTest Script variable: none
CTestmodule variable:CUDA_SANITIZER_COMMAND_OPTIONS
CTest Submit Step¶
In a CTest Script, the ctest_submit() command runs this step. Arguments to the command may specify some of the step settings.
Configuration settings include
BuildNameDescribe the dashboard client platform with a short string. (Operating system, compiler, etc.)
CTest Script variable:
CTEST_BUILD_NAMECTestmodule variable:BUILDNAME
CDashVersion遗留选项。未使用。
CTest Script variable: none, detected from server
CTestmodule variable:CTEST_CDASH_VERSION
CTestSubmitRetryCountSpecify a number of attempts to retry submission on network failure.
CTest Script variable: none, use the
ctest_submit()RETRY_COUNToption.CTestmodule variable:CTEST_SUBMIT_RETRY_COUNT
CTestSubmitRetryDelaySpecify a delay before retrying submission on network failure.
CTest Script variable: none, use the
ctest_submit()RETRY_DELAYoption.CTestmodule variable:CTEST_SUBMIT_RETRY_DELAY
CurlOptionsDeprecated since version 3.30: Use
TLSVerifyinstead.Specify a semicolon-separated list of options to control the Curl library that CTest uses internally to connect to the server.
CTest Script variable:
CTEST_CURL_OPTIONSCTestmodule variable:CTEST_CURL_OPTIONS
Possible options are
CURLOPT_SSL_VERIFYPEER_OFFDisable the
CURLOPT_SSL_VERIFYPEERcurl option.CURLOPT_SSL_VERIFYHOST_OFFDisable the
CURLOPT_SSL_VERIFYHOSTcurl option.
DropLocationLegacy option. When
SubmitURLis not set, it is constructed fromDropMethod,DropSiteUser,DropSitePassword,DropSite, andDropLocation.CTest Script variable:
CTEST_DROP_LOCATIONCTestmodule variable:DROP_LOCATIONif set, elseCTEST_DROP_LOCATION
DropMethodLegacy option. When
SubmitURLis not set, it is constructed fromDropMethod,DropSiteUser,DropSitePassword,DropSite, andDropLocation.CTest Script variable:
CTEST_DROP_METHODCTestmodule variable:DROP_METHODif set, elseCTEST_DROP_METHOD
DropSiteLegacy option. When
SubmitURLis not set, it is constructed fromDropMethod,DropSiteUser,DropSitePassword,DropSite, andDropLocation.CTest Script variable:
CTEST_DROP_SITECTestmodule variable:DROP_SITEif set, elseCTEST_DROP_SITE
DropSitePasswordLegacy option. When
SubmitURLis not set, it is constructed fromDropMethod,DropSiteUser,DropSitePassword,DropSite, andDropLocation.CTest Script variable:
CTEST_DROP_SITE_PASSWORDCTestmodule variable:DROP_SITE_PASSWORDif set, elseCTEST_DROP_SITE_PASSWORD
DropSiteUserLegacy option. When
SubmitURLis not set, it is constructed fromDropMethod,DropSiteUser,DropSitePassword,DropSite, andDropLocation.CTest Script variable:
CTEST_DROP_SITE_USERCTestmodule variable:DROP_SITE_USERif set, elseCTEST_DROP_SITE_USER
IsCDash遗留选项。未使用。
CTest Script variable:
CTEST_DROP_SITE_CDASHCTestmodule variable:CTEST_DROP_SITE_CDASH
ScpCommand遗留选项。未使用。
CTest Script variable:
CTEST_SCP_COMMANDCTestmodule variable:SCPCOMMAND
SiteDescribe the dashboard client host site with a short string. (Hostname, domain, etc.)
CTest Script variable:
CTEST_SITECTestmodule variable:SITE, initialized by thesite_name()command
SubmitURLThe
httporhttpsURL of the dashboard server to send the submission to.CTest Script variable:
CTEST_SUBMIT_URLCTestmodule variable:SUBMIT_URLif set, elseCTEST_SUBMIT_URL
SubmitInactivityTimeoutThe time to wait for the submission after which it is canceled if not completed. Specify a zero value to disable timeout.
CTest Script variable:
CTEST_SUBMIT_INACTIVITY_TIMEOUTCTestmodule variable:CTEST_SUBMIT_INACTIVITY_TIMEOUT
TLSVersion3.30 版本新增。
Specify a minimum TLS version allowed when submitting to a dashboard via
https://URLs.CTest Script variable:
CTEST_TLS_VERSIONCTestmodule variable:CTEST_TLS_VERSION
版本 3.31 中有更改: 默认值为 TLS 1.2。此前,默认情况下没有强制执行最低版本。
TLSVerify3.30 版本新增。
Specify a boolean value indicating whether to verify the server certificate when submitting to a dashboard via
https://URLs.CTest Script variable:
CTEST_TLS_VERIFYCTestmodule variable:CTEST_TLS_VERIFY
Changed in version 3.31: The default is on. Previously, the default was off. Users may set the
CMAKE_TLS_VERIFYenvironment variable to0to restore the old default.TriggerSite遗留选项。未使用。
CTest模块变量:TRIGGER_SITE,如果已设置,否则为CTEST_TRIGGER_SITE
显示为 JSON 对象模型¶
3.14 版新增。
当给定 --show-only=json-v1 命令行选项时,测试信息将以 JSON 格式输出。 JSON 对象模型 1.0 版本定义如下:
种类字符串“ctestInfo”。
版本一个 JSON 对象,指定版本组件。其成员是:
主要版本一个正整数,指定 JSON 对象模型的主版本组件。
次要版本一个非负整数,指定 JSON 对象模型的次版本组件。
backtraceGraph表示回溯信息的 JSON 对象,具有以下成员:
commands命令名称列表。
files文件名列表。
nodes节点 JSON 对象列表,具有以下成员:
命令当节点代表文件中的命令调用时存在的可选成员。其值为
backtraceGraph的commands成员的 0 基索引(无符号整数)。filebacktraceGraph的files成员的 0 基索引(无符号整数)。行当节点代表文件中的某一行时存在的可选成员。其值为文件中添加回溯的 1 基行号(无符号整数)。
parent当节点不是调用堆栈底部时存在的可选成员。其值为
backtraceGraph的nodes成员的 0 基索引(无符号整数),表示图中的父节点。
tests一个 JSON 数组,列出每个测试的信息。每个条目都是一个 JSON 对象,其成员如下:
名称测试名称。此项不能为空。
config可选字段,指定测试将运行的配置。这将始终与
ctest命令行上指定的-C选项匹配。如果未给出该选项,则此字段将不存在。命令可选数组,其中第一个元素是测试命令,其余元素是命令参数。通常,此字段应存在且不为空,但在某些涉及生成器表达式的特殊情况下,测试可能没有命令,因此此字段可能缺失。
回溯backtraceGraph的nodes成员的索引。属性可选数组,包含测试属性。每个数组项将是一个 JSON 对象,具有以下成员:
名称测试属性的名称。此项不能为空。
value属性值,可以是字符串、数字、布尔值或字符串数组。
版本 4.1 中添加:JSON 输出格式由 此 JSON 模式 以机器可读的形式描述。
资源分配¶
CTest 提供了一种机制,允许测试以精细的方式指定它们所需的资源,并允许用户指定运行机器上可用的资源。这使得 CTest 能够内部跟踪哪些资源正在使用,哪些是空闲的,从而以一种防止测试尝试获取不可用资源的方式来调度测试。
当使用资源分配功能时,CTest 不会过度订阅资源。例如,如果一个资源有 8 个槽,CTest 不会同时运行总共使用超过 8 个槽的测试。这会限制在任何给定时间可以运行的测试数量,即使使用了很高的 -j 参数,如果这些测试都使用了同一资源的某些槽。此外,这意味着一个使用比机器上可用资源更多的资源的单个测试将根本不会运行(并将被报告为 Not Run)。
此功能的一个常见用例是需要使用 GPU 的测试。多个测试可以同时从 GPU 分配内存,但如果太多测试试图这样做,其中一些将无法分配,导致测试失败,即使该测试在获得所需内存的情况下会成功。通过使用资源分配功能,每个测试都可以指定它从 GPU 需要多少内存,从而允许 CTest 以一种方式调度测试,使得同时运行这些测试中的多个不会耗尽 GPU 的内存池。
请注意,CTest 对 GPU 是什么或它有多少内存没有概念。它没有任何方法可以与 GPU 通信以检索此信息或执行任何内存管理,尽管项目可以定义一个提供有关测试机器详细信息的测试(请参阅 动态生成的资源规范文件)。
CTest 跟踪抽象资源类型的列表,每种类型都有一定数量的槽可供测试使用。每个测试指定它从特定资源所需的槽数,然后 CTest 以一种方式调度它们,以防止正在使用的槽总数超过列出的容量。当执行测试并为其分配资源槽时,测试可以假定它们在测试过程的持续时间内对这些槽拥有独占使用权。
CTest 资源分配功能至少包括两个输入:
下面描述的 资源规范文件,它描述了系统上可用的资源。
测试的
RESOURCE_GROUPS属性,它描述了测试所需的资源。
当 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_CODE 或 SKIP_REGULAR_EXPRESSION 属性来指示跳过的测试。
资源规范文件¶
资源规范文件是一个 JSON 文件,可以通过多种方式传递给 CTest。它可以通过 ctest --resource-spec-file 选项在命令行上指定,可以使用 ctest_test() 的 RESOURCE_SPEC_FILE 参数给出,或者可以在测试执行过程中动态生成(请参阅 动态生成的资源规范文件)。
如果使用仪表板脚本并且未指定 RESOURCE_SPEC_FILE,则使用仪表板脚本中的 CTEST_RESOURCE_SPEC_FILE 的值。如果未指定 --resource-spec-file、RESOURCE_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。这些名称必须以小写字母或下划线开头,后续字符可以是小写字母、数字或下划线。不允许使用大写字母,因为某些平台对环境变量不区分大小写。有关更多信息,请参阅下面的 环境变量 部分。建议资源类型名称是名词的复数形式,例如gpus或crypto_chips(而不是gpu或crypto_chip)。请注意,
gpus和crypto_chips这些名称只是示例,CTest 不会以任何方式解释它们。您可以自由创建任何资源类型以满足自己的需求。每个资源类型的值是一个 JSON 数组,其中包含 JSON 对象,每个对象描述指定资源的特定实例。这些对象具有以下成员:
id一个由资源标识符组成的字符串。标识符中的每个字符可以是小写字母、数字或下划线。不允许使用大写字母。
同一资源类型内的标识符必须唯一。但是,它们不一定跨资源类型唯一。例如,可以有一个名为
0的gpus资源和一个名为0的crypto_chips资源,但不能有两个同名为0的gpus资源。请注意,ID
0、1、2、3和card0只是示例,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 决定将哪些资源分配给测试,它就会将此信息作为一系列环境变量传递给测试可执行文件。对于下面的每个示例,我们将假定测试具有 RESOURCE_GROUPS 属性 2,gpus:2;gpus:4,gpus:1,crypto_chips:2。
将以下变量传递给测试进程:
- 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>是从零到CTEST_RESOURCE_GROUP_COUNT减一的数字。CTEST_RESOURCE_GROUP_<num>对此范围内的每个<num>都被定义。例如:CTEST_RESOURCE_GROUP_0=gpusCTEST_RESOURCE_GROUP_1=gpusCTEST_RESOURCE_GROUP_2=crypto_chips,gpus
- CTEST_RESOURCE_GROUP_<num>_<resource-type>¶
为给定资源类型分配给每个组的资源 ID 和槽数列表。此变量由一系列对组成,每对之间用分号分隔,对中的两项用逗号分隔。每对中的第一项是
id:后跟资源类型的 ID,第二项是slots:后跟分配给该组的来自该资源的槽数。例如:CTEST_RESOURCE_GROUP_0_GPUS=id:0,slots:2CTEST_RESOURCE_GROUP_1_GPUS=id:2,slots:2CTEST_RESOURCE_GROUP_2_GPUS=id:1,slots:4;id:3,slots:1CTEST_RESOURCE_GROUP_2_CRYPTO_CHIPS=id:card0,slots:2
在此示例中,组 0 从 GPU
0获取 2 个槽,组 1 从 GPU2获取 2 个槽,组 2 从 GPU1获取 4 个槽,从 GPU3获取 1 个槽,以及从加密芯片card0获取 2 个槽。<num>是从零到CTEST_RESOURCE_GROUP_COUNT减一的数字。<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 属性中必须只有一项。 CTest 将此项视为具有特殊含义:它是生成资源规范文件的 fixture。该 fixture 可以有任何名称。如果存在这样的 fixture,所有设置了 RESOURCE_GROUPS 的测试必须在其 FIXTURES_REQUIRED 中包含该 fixture,并且不能使用 --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 的帮助
- 主页
-
学习 CMake 的主要起点。
- 在线文档和社区资源
https://cmake.com.cn/documentation
此网页上可以找到可用文档和社区资源的链接。
- 论坛
-
论坛用于讨论和提问 CMake。