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>]

並行執行測試,可選擇限制為給定的並行層級。

版本 3.29 新增: <level> 可以省略,或 0,在這種情況下

  • Job Server 整合 下,並行性受到可用工作權杖的限制。

  • 否則,如果省略該值,則並行性受處理器數量或 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 選項結合使用很有用。

版本 3.14 新增: --show-only 選項接受 <format> 值。

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

human

人類友善的輸出。不保證穩定。這是預設值。

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 設定測試失敗的測試。

-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 文件中關於 收集使用者模式轉儲 的說明。

在版本 4.0 中變更: Windows 錯誤報告 (WER) 在互動模式下啟用,因此測試程序可能會顯示偵錯彈出視窗並建立核心轉儲。這是透過更新 libuv 實現的。

在版本 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

使用隨機順序排程測試。

此選項將以隨機順序執行測試。它通常用於偵測測試套件中的隱含依賴關係。

--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 環境變數來設定。

查看說明

若要列印版本詳細資訊或 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) 手冊中 <cmd> 的條目。輸出會列印到指定的 <file> (如果已給定)。

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

列出可用的命令說明並退出。

清單包含所有可透過使用 --help-command 選項後接命令名稱來取得說明的命令。輸出會列印到指定的 <file> (如果已給定)。

--help-commands [<file>]

列印 cmake-commands 手冊並退出。

以人類可讀的文字格式列印 cmake-commands(7) 手冊。輸出會列印到指定的 <file> (如果已給定)。

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

列印單一模組的說明並退出。

以人類可讀的文字格式列印 cmake-modules(7) 手冊中 <mod> 的條目。輸出會列印到指定的 <file> (如果已給定)。

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

列出可用的模組說明並退出。

清單包含所有可透過使用 --help-module 選項後接模組名稱來取得說明的模組。輸出會列印到指定的 <file> (如果已給定)。

--help-modules [<file>]

列印 cmake-modules 手冊並退出。

以人類可讀的文字格式列印 cmake-modules(7) 手冊。輸出會列印到指定的 <file> (如果已給定)。

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

列印單一策略的說明並退出。

以人類可讀的文字格式列印 cmake-policies(7) 手冊中 <cmp> 的條目。輸出會列印到指定的 <file> (如果已給定)。

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

列出可用的策略說明並退出。

清單包含所有可透過使用 --help-policy 選項後接策略名稱來取得說明的策略。輸出會列印到指定的 <file> (如果已給定)。

--help-policies [<file>]

列印 cmake-policies 手冊並退出。

以人類可讀的文字格式列印 cmake-policies(7) 手冊。輸出會列印到指定的 <file> (如果已給定)。

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

列印單一屬性的說明並退出。

以人類可讀的文字格式列印 cmake-properties(7) 手冊中 <prop> 的條目。輸出會列印到指定的 <file> (如果已給定)。

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

列出可用的屬性說明並退出。

清單包含所有可透過使用 --help-property 選項後接屬性名稱來取得說明的屬性。輸出會列印到指定的 <file> (如果已給定)。

--help-properties [<file>]

列印 cmake-properties 手冊並退出。

以人類可讀的文字格式列印 cmake-properties(7) 手冊。輸出會列印到指定的 <file> (如果已給定)。

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

列印單一變數的說明並退出。

以人類可讀的文字格式列印 cmake-variables(7) 手冊中 <var> 的條目。輸出會列印到指定的 <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 test 運行 ctest 將選擇 test2,它同時具有這兩個標籤。使用 -L test 運行 CTest 將選擇 test2test5,因為它們都具有與該正規表示式匹配的標籤。

由於匹配適用於正規表示式,請注意使用 -L es 運行 CTest 將匹配所有五個測試。若要同時選擇 tuesdaywednesday 測試,請使用單個正規表示式來匹配它們中的任何一個,例如 -L "tue|wed"

標籤和子專案摘要

CTest 列印與運行的測試關聯的每個 LABEL 和子專案的時間摘要資訊。標籤時間摘要將不包含映射到子專案的標籤。

版本 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]:CTest PROCESSORS 屬性對於 j 標籤或子專案的第 i 個測試的值

  • num_tests[j]:與 j 標籤或子專案關聯的測試數量

  • total:至少運行一個測試的標籤或子專案的總數

因此,每個標籤或子專案的加權時間摘要表示 CTest 給予運行每個標籤或子專案的測試的時間量,並且在與其他標籤或子專案比較時,可以很好地表示每個標籤或子專案的測試的總費用。

例如,如果 SubprojectA 顯示 100 sec*proc,而 SubprojectB 顯示 10 sec*proc,則 CTest 分配了大約 10 倍的 CPU/核心時間來運行 SubprojectA 的測試,而不是 SubprojectB 的測試 (例如,因此,如果要花費精力來降低整個專案的測試套件的成本,那麼降低 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 --hard 重置為 FETCH_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

指定管理來源樹的版本控制系統(如果無法自動偵測)。值可以是 bzrcvsgithgp4svn

  • 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

當要啟動的建置系統允許在建置時選擇組態(例如 DebugRelease)時,這會指定在未向 ctest 命令提供 -C 選項時要建置的預設組態。該值將替換 MakeCommand 的值,以取代其中出現的文字字串 ${CTEST_CONFIGURATION_TYPE}

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

指定在使用已啟用 Sanitizer 的建置執行時,Sanitizer 的選項。

MemoryCheckSuppressionFile

指定包含 MemoryCheckCommand 工具抑制規則的檔案。它將與工具適用的選項一起傳遞。

其他組態設定包括

BoundsCheckerCommand

指定一個 MemoryCheckCommand,已知其與 Bounds Checker 命令列相容。

PurifyCommand

指定一個 MemoryCheckCommand,已知其與 Purify 命令列相容。

ValgrindCommand

指定一個 MemoryCheckCommand,已知其與 Valgrind 命令列相容。

ValgrindCommandOptions

指定 ValgrindCommand 工具的命令列選項。它們將放置在測試命令列之前。

DrMemoryCommand

指定一個 MemoryCheckCommand,已知其與 DrMemory 命令列相容。

DrMemoryCommandOptions

指定 DrMemoryCommand 工具的命令列選項。它們將放置在測試命令列之前。

CudaSanitizerCommand

指定一個 MemoryCheckCommand,已知其與 cuda-memcheck 或 compute-sanitizer 命令列相容。

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 時,它會從 DropMethodDropSiteUserDropSitePasswordDropSiteDropLocation 建構而來。

DropMethod

舊版選項。當未設定 SubmitURL 時,它會從 DropMethodDropSiteUserDropSitePasswordDropSiteDropLocation 建構而來。

DropSite

舊版選項。當未設定 SubmitURL 時,它會從 DropMethodDropSiteUserDropSitePasswordDropSiteDropLocation 建構而來。

DropSitePassword

舊版選項。當未設定 SubmitURL 時,它會從 DropMethodDropSiteUserDropSitePasswordDropSiteDropLocation 建構而來。

DropSiteUser

舊版選項。當未設定 SubmitURL 時,它會從 DropMethodDropSiteUserDropSitePasswordDropSiteDropLocation 建構而來。

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 版定義如下

kind

字串 "ctestInfo"。

version

指定版本組件的 JSON 物件。其成員為

major

指定主要版本組件的非負整數。

minor

指定次要版本組件的非負整數。

backtraceGraph

表示回溯資訊的 JSON 物件,具有以下成員

commands

命令名稱清單。

files

檔案名稱清單。

nodes

節點 JSON 物件清單,具有成員

command

backtraceGraphcommands 成員中的索引。

file

backtraceGraphfiles 成員中的索引。

line

新增回溯的檔案中的行號。

parent

backtraceGraphnodes 成員中的索引,表示圖表中的父節點。

tests

列出每個測試相關資訊的 JSON 陣列。每個項目都是一個 JSON 物件,具有成員

name

測試名稱。

config

測試可以執行的組態。空字串表示任何組態。

command

清單,其中第一個元素是測試命令,其餘元素是命令引數。

backtrace

backtraceGraphnodes 成員中的索引。

properties

測試屬性。可以包含每個支援的測試屬性的鍵。

資源分配

CTest 提供一種機制,讓測試能夠以細緻的方式指定它們需要的資源,並讓使用者指定執行機器上可用的資源。這讓 CTest 能夠在內部追蹤哪些資源正在使用中,哪些是空閒的,並以防止測試嘗試聲明不可用的資源的方式排程測試。

當使用資源分配功能時,CTest 不會過度訂閱資源。例如,如果一個資源有 8 個插槽,CTest 將不會同時執行總共使用超過 8 個插槽的測試。即使使用了較高的 -j 引數,如果這些測試都使用來自同一個資源的一些插槽,這也會限制在任何給定時間可以執行的測試數量。此外,這也表示單一測試使用的資源比機器上可用的資源還多,則該測試將完全不會執行(並將報告為 未執行)。

此功能的一個常見使用案例是用於需要使用 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_RESOURCE_GROUP_COUNT 變數將不存在,即使它存在於父 ctest 程序中。如果測試絕對必須進行資源分配,則它可以傳回失敗的結束代碼,或使用 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
        }
      ]
    }
  ]
}

成員為

version

一個物件,包含 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

在上面的範例檔案中,有四個 ID 為 0 到 3 的 GPU。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 減一的數字。為此範圍內的每個 <num> 定義 CTEST_RESOURCE_GROUP_<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> 是從零到 CTEST_RESOURCE_GROUP_COUNT 減一的數字。<resource-type> 是資源類型的名稱,轉換為大寫。為上述範圍中每個 <num>CTEST_RESOURCE_GROUP_<num> 中列出的每個資源類型的乘積定義 CTEST_RESOURCE_GROUP_<num>_<resource-type>

由於某些平台的環境變數名稱不區分大小寫,因此資源類型的名稱在不區分大小寫的環境中可能不會衝突。因此,為了簡化起見,所有資源類型都必須在 資源規格檔案RESOURCE_GROUPS 屬性中以全小寫字母列出,並且它們在 CTEST_RESOURCE_GROUP_<num>_<resource-type> 環境變數中轉換為全大寫字母。

動態產生的資源規格檔案

在版本 3.28 中新增。

專案可以選擇性地指定單一測試,該測試將用於動態產生 CTest 將用於排程使用資源的測試的資源規格檔案。產生檔案的測試必須設定 GENERATED_RESOURCE_SPEC_FILE 屬性,並且在其 FIXTURES_SETUP 屬性中必須恰好有一個 fixture。CTest 認為此 fixture 具有特殊意義:它是產生資源規格檔案的 fixture。fixture 可以有任何名稱。如果存在此類 fixture,則所有設定了 RESOURCE_GROUPS 的測試都必須在其 FIXTURES_REQUIRED 中具有該 fixture,並且資源規格檔案可能無法使用 --resource-spec-file 引數或 CTEST_RESOURCE_SPEC_FILE 變數指定。

Job Server 整合

版本 3.29 新增。

在 POSIX 系統上,當在 Job Server 的環境下執行時,CTest 會共享其 job slots。這與 PROCESSORS 測試屬性無關,該屬性仍然會計入 CTest 的 -j 並行層級。CTest 在執行每個測試之前會從 job server 取得一個 token,並在測試完成時歸還。

例如,考慮以下 Makefile

test:
	+ctest -j 8

當透過 make -j 2 test 呼叫時,ctest 會連接到 job server,為每個測試取得一個 token,並且最多同時執行 2 個測試。

在 Windows 系統上,job server 整合尚未實作。

參見

以下資源可用於取得 CMake 使用方面的協助

首頁

https://cmake.dev.org.tw

學習 CMake 的主要起點。

線上文件與社群資源

https://cmake.dev.org.tw/documentation

可以在此網頁上找到可用文件和社群資源的連結。

Discourse 論壇

https://discourse.cmake.org

Discourse 論壇託管關於 CMake 的討論和問題。