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=<預設值>¶
使用測試預設值來指定測試選項。專案二進位目錄是從
configurePreset
鍵推斷的。目前的工作目錄必須包含 CMake 預設檔案。請參閱預設值
以取得更多詳細資訊。
- --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 [<層級>], --parallel [<層級>]¶
並行執行測試,可選擇限制為給定的並行層級。
在 3.29 版本中新增:可以省略
<層級>
或0
,在這種情況下在 任務伺服器整合 下,並行性受到可用任務權杖的限制。
否則,如果省略該值,則並行性受到處理器數量的限制,或 2,以較大者為準。
否則,如果該值為
0
,則並行性不受限制。
也可以透過
CTEST_PARALLEL_LEVEL
環境變數來指定此選項。此選項可以與
PROCESSORS
測試屬性搭配使用。請參閱 標籤與子專案摘要。
- --resource-spec-file <檔案>¶
在啟用 資源分配 的情況下執行 CTest,並使用
<檔案>
中指定的 資源規格檔案。當 ctest 作為 儀表板用戶端 執行時,這會設定 CTest 測試步驟的
ResourceSpecFile
選項。
- --test-load <層級>¶
在並行執行測試時(例如,使用
-j
),嘗試在它們可能導致 CPU 負載超過給定閾值時不要啟動測試。當 ctest 作為 儀表板用戶端 執行時,這會設定 CTest 測試步驟的
TestLoad
選項。
- -Q, --quiet¶
讓 CTest 靜音。
此選項將會抑制所有輸出。如果指定了
--output-log
,仍然會產生輸出日誌檔。如果指定了--quiet
,則會忽略諸如--verbose
、--extra-verbose
和--debug
之類的選項。
- -O <檔案>, --output-log <檔案>¶
輸出到日誌檔。
此選項會指示 CTest 將其所有輸出寫入
<檔案>
日誌檔。
- --output-junit <檔案>¶
於 3.21 版本新增。
以 JUnit 格式寫入測試結果。
此選項會指示 CTest 以 JUnit XML 格式將測試結果寫入
<檔案>
。如果<檔案>
已經存在,它將會被覆寫。如果使用-S
選項來執行儀表板腳本,請改用ctest_test()
命令的OUTPUT_JUNIT
關鍵字。
- -N, --show-only[=<格式>]¶
停用實際執行測試。
此選項會指示 CTest 列出將要執行的測試,但實際上不執行它們。與
-R
和-E
選項一起使用時很有用。於 3.14 版本新增:
--show-only
選項接受<格式>
值。<格式>
可以是下列其中一個值。human
人類友善的輸出。不保證穩定。這是預設值。
json-v1
以 JSON 格式傾印測試資訊。請參閱 以 JSON 物件模型顯示。
- -L <正規表示式>, --label-regex <正規表示式>¶
執行標籤與 string(REGEX) 中所述的正規表示式相符的測試。
此選項會指示 CTest 僅執行標籤與給定正規表示式相符的測試。當給定多個
-L
選項時,只有在每個正規表示式都與測試的至少一個標籤相符時,才會執行測試(即多個-L
標籤形成AND
關係)。請參閱 標籤比對。
- -R <正規表示式>, --tests-regex <正規表示式>¶
執行與正規表示式相符的測試。
此選項會指示 CTest 僅執行名稱與給定正規表示式相符的測試。
- -E <正規表示式>, --exclude-regex <正規表示式>¶
排除與正規表示式相符的測試。
此選項會指示 CTest 不要執行名稱與給定正規表示式相符的測試。
- -LE <正規表示式>, --label-exclude <正規表示式>¶
排除標籤與正規表示式相符的測試。
此選項會指示 CTest 不要執行標籤與給定正規表示式相符的測試。當給定多個
-LE
選項時,只有在每個正規表示式都與測試的至少一個標籤相符時,才會排除測試(即多個-LE
標籤形成AND
關係)。請參閱 標籤比對。
- --tests-from-file <檔案名稱>¶
於 3.29 版本新增。
執行給定檔案中列出的測試。
此選項會指示 CTest 執行給定檔案中列出的測試。該檔案每行必須包含一個確切的測試名稱。不完全符合任何測試名稱的行將被忽略。此選項可以與其他選項(如
-R
、-E
、-L
或-LE
)組合使用。
- --exclude-from-file <檔案名稱>¶
於 3.29 版本新增。
排除給定檔案中列出的測試。
此選項會指示 CTest 不要執行給定檔案中列出的測試。該檔案每行必須包含一個確切的測試名稱。不完全符合任何測試名稱的行將被忽略。此選項可以與其他選項(如
-R
、-E
、-L
或-LE
)組合使用。
- -FA <正規表示式>, --fixture-exclude-any <正規表示式>¶
從自動將任何測試新增到測試集中,排除與
<正規表示式>
相符的 fixture。如果待執行的測試集中的某個測試需要特定的 fixture,則該 fixture 的設定和清除測試通常會自動新增到測試集中。此選項可防止新增與
<正規表示式>
相符的 fixture 的設定或清除測試。請注意,會保留所有其他 fixture 行為,包括測試相依性和跳過 fixture 設定測試失敗的測試。
- -I [開始,結束,步幅,測試#,測試#|測試 檔案], --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
。在 CMake 3.11 之前,Windows 上的互動模式允許顯示系統偵錯彈出視窗。現在,由於 CTest 使用
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 執行個體作為新的程序執行。
預設情況下,CTest 會在同一個程序中執行子 CTest 執行個體。如果不需要此行為,則此引數會強制子 CTest 程序使用新的程序。
- --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>]¶
列印一個命令的說明並結束。
以人類可讀的文字格式列印
<cmd>
的cmake-commands(7)
手冊條目。如果指定了<file>
,則輸出將列印到該檔案。
- --help-command-list [<file>]¶
列出可取得說明的命令並結束。
該清單包含所有可使用
--help-command
選項後跟命令名稱來取得說明的命令。如果指定了<file>
,則輸出將列印到該檔案。
- --help-commands [<file>]¶
列印 cmake-commands 手冊並結束。
以人類可讀的文字格式列印
cmake-commands(7)
手冊。如果指定了<file>
,則輸出將列印到該檔案。
- --help-module <mod> [<file>]¶
列印一個模組的說明並結束。
以人類可讀的文字格式列印
<mod>
的cmake-modules(7)
手冊條目。如果指定了<file>
,則輸出將列印到該檔案。
- --help-module-list [<file>]¶
列出可取得說明的模組並結束。
該清單包含所有可使用
--help-module
選項後跟模組名稱來取得說明的模組。如果指定了<file>
,則輸出將列印到該檔案。
- --help-modules [<file>]¶
列印 cmake-modules 手冊並結束。
以人類可讀的文字格式列印
cmake-modules(7)
手冊。如果指定了<file>
,則輸出將列印到該檔案。
- --help-policy <cmp> [<file>]¶
列印一個政策的說明並結束。
以人類可讀的文字格式列印
<cmp>
的cmake-policies(7)
手冊條目。如果指定了<file>
,則輸出將列印到該檔案。
- --help-policy-list [<file>]¶
列出可取得說明的政策並結束。
該清單包含所有可使用
--help-policy
選項後跟政策名稱來取得說明的政策。如果指定了<file>
,則輸出將列印到該檔案。
- --help-policies [<file>]¶
列印 cmake-policies 手冊並結束。
以人類可讀的文字格式列印
cmake-policies(7)
手冊。如果指定了<file>
,則輸出將列印到該檔案。
- --help-property <prop> [<file>]¶
列印一個屬性的說明並結束。
以人類可讀的文字格式列印
<prop>
的cmake-properties(7)
手冊條目。如果指定了<file>
,則輸出將列印到該檔案。
- --help-property-list [<file>]¶
列出可取得說明的屬性並結束。
該清單包含所有可使用
--help-property
選項後跟屬性名稱來取得說明的屬性。如果指定了<file>
,則輸出將列印到該檔案。
- --help-properties [<file>]¶
列印 cmake-properties 手冊並結束。
以人類可讀的文字格式列印
cmake-properties(7)
手冊。如果指定了<file>
,則輸出將列印到該檔案。
- --help-variable <var> [<file>]¶
列印一個變數的說明並結束。
以人類可讀的文字格式印出
<var>
的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
使用 -L tuesday -L test
執行 ctest 將會選取具有這兩個標籤的 test2。使用 -L test
執行 CTest 將會選取 test2 和 test5,因為它們都具有符合該正規表示式的標籤。
由於比對會使用正規表示式,請注意使用 -L es
執行 CTest 將會比對所有五個測試。若要一起選取 tuesday 和 wednesday 測試,請使用符合其中任一者的單一正規表示式,例如 -L "tue|wed"
。
標籤和子專案摘要¶
CTest 會針對每個與所執行測試相關聯的 LABEL
和子專案印出時間摘要資訊。標籤時間摘要將不會包含對應至子專案的標籤。
在 3.22 版中新增: 在測試執行期間動態新增的標籤也會在時間摘要中報告。請參閱 其他標籤。
當設定 PROCESSORS
測試屬性時,CTest 將會在標籤和子專案摘要中顯示加權測試時間結果。時間會以 秒*處理器 而不是僅僅 秒 來報告。
針對每個標籤或子專案 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 秒*處理器
,而 SubprojectB
顯示 10 秒*處理器
,則 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-and-test
必須提供 --build-generator
選項。如果指定了 --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 客戶端並執行儀表板測試。所有測試都是
<模式><測試>
,其中<模式>
可以是Experimental
、Nightly
和Continuous
,而<測試>
可以是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>¶
新增具有提交內容的附註檔案。
此選項告訴 CTest 在提交儀表板時包含附註檔案。
- --tomorrow-tag¶
Nightly
或Experimental
從下一天的標籤開始。如果建置不會在一天內完成,這會很有用。
- --extra-submit <file>[;<file>]¶
將額外的檔案提交至儀表板。
此選項會將額外的檔案提交至儀表板。
- --http-header <header>¶
於 3.29 版本新增。
在提交至儀表板時附加 HTTP 標頭。
此選項會導致 CTest 在提交至儀表板時附加指定的標頭。此選項可以多次指定。
- --http1.0¶
使用 HTTP 1.0 提交。
此選項會強制 CTest 使用 HTTP 1.0 將檔案提交至儀表板,而不是 HTTP 1.1。
- --no-compress-output¶
提交時不壓縮測試輸出。
此旗標會關閉測試輸出的自動壓縮。使用此旗標以維持與不支援壓縮測試輸出的舊版 CDash 的相容性。
儀表板客戶端步驟¶
CTest 定義了測試步驟的排序清單,其中部分或全部步驟可以作為儀表板客戶端執行
開始
開始新的儀表板提交,其中包含由下列步驟記錄的結果。請參閱下方的 CTest 開始步驟 章節。
更新
從其版本控制儲存庫更新來源樹狀結構。記錄舊版和新版以及更新的來源檔案清單。請參閱下方的 CTest 更新步驟 章節。
設定
透過在建置樹中執行命令來設定軟體。記錄設定輸出的日誌。請參閱下方的CTest 設定步驟章節。
建置
透過在建置樹中執行命令來建置軟體。記錄建置輸出的日誌並偵測警告和錯誤。請參閱下方的CTest 建置步驟章節。
測試
透過從建置樹載入
CTestTestfile.cmake
並執行定義的測試來測試軟體。記錄每個測試的輸出和結果。請參閱下方的CTest 測試步驟章節。覆蓋率
透過執行覆蓋率分析工具並記錄其輸出,計算原始碼的覆蓋率。請參閱下方的CTest 覆蓋率步驟章節。
記憶體檢查
透過記憶體檢查工具執行軟體測試套件。記錄測試輸出、結果和工具回報的問題。請參閱下方的CTest 記憶體檢查步驟章節。
提交
將從其他測試步驟記錄的結果提交到軟體品質儀表板伺服器。請參閱下方的CTest 提交步驟章節。
儀表板客戶端模式¶
CTest 定義了三種作為儀表板客戶端的操作模式
夜間
此模式旨在每天調用一次,通常在夜間。它預設啟用
Start
、Update
、Configure
、Build
、Test
、Coverage
和Submit
步驟。即使Update
步驟回報原始碼樹沒有變更,選定的步驟也會執行。持續
此模式旨在全天重複調用。它預設啟用
Start
、Update
、Configure
、Build
、Test
、Coverage
和Submit
步驟,但如果Update
步驟回報原始碼樹沒有變更,則在該步驟後退出。實驗性
此模式旨在由開發人員調用以測試本機變更。它預設啟用
Start
、Configure
、Build
、Test
、Coverage
和Submit
步驟。
透過 CTest 命令列的儀表板客戶端¶
CTest 可以在已產生的建置樹上執行測試。將目前工作目錄設定為建置樹,然後使用以下其中一種簽名來執行 ctest 命令
ctest -D <mode>[<step>]
ctest -M <mode> [-T <step>]...
<mode>
必須是上述儀表板客戶端模式之一,並且每個 <step>
必須是上述儀表板客戶端步驟之一。
CTest 從建置樹中名為 CTestConfiguration.ini
或 DartConfiguration.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
命令列工具。CTest
模組變數:無
BZRUpdateOptions
更新原始碼時傳遞至
BZRCommand
的命令列選項。CTest
模組變數:無
CVSCommand
如果原始碼樹是由 CVS 管理,則使用
cvs
命令列工具。CTest
模組變數:CVSCOMMAND
CVSUpdateOptions
更新原始碼時,
CVSCommand
的命令列選項。CTest
模組變數:CVS_UPDATE_OPTIONS
GITCommand
如果原始碼樹是由 Git 管理,則使用
git
命令列工具。CTest
模組變數:GITCOMMAND
原始碼樹會先使用
git fetch
更新,然後使用git reset --hard
重置到FETCH_HEAD
。結果與git pull
相同,但任何本機修改都會被覆寫。使用GITUpdateCustom
來指定不同的方法。GITInitSubmodules
如果設定此選項,CTest 將在更新前更新儲存庫的子模組。
CTest
模組變數:CTEST_GIT_INIT_SUBMODULES
GITUpdateCustom
指定一個自訂命令列(以分號分隔的列表),使其在原始碼樹(Git 工作樹)中執行,以更新原始碼樹,而不是執行
GITCommand
。CTest
模組變數:CTEST_GIT_UPDATE_CUSTOM
GITUpdateOptions
更新原始碼時,
GITCommand
的命令列選項。CTest
模組變數:GIT_UPDATE_OPTIONS
HGCommand
如果原始碼樹是由 Mercurial 管理,則使用
hg
命令列工具。CTest
模組變數:無
HGUpdateOptions
更新原始碼時,
HGCommand
的命令列選項。CTest
模組變數:無
P4Client
P4Command
的-c
選項的值。CTest
模組變數:CTEST_P4_CLIENT
P4Command
如果原始碼樹是由 Perforce 管理,則使用
p4
命令列工具。CTest
模組變數:P4COMMAND
P4Options
所有調用中,
P4Command
的命令列選項。CTest
模組變數:CTEST_P4_OPTIONS
P4UpdateCustom
指定一個自訂命令列(以分號分隔的列表),使其在原始碼樹(Perforce 樹)中執行,以更新原始碼樹,而不是執行
P4Command
。P4UpdateOptions
更新原始碼時,
P4Command
的命令列選項。CTest
模組變數:CTEST_P4_UPDATE_OPTIONS
SVNCommand
如果原始碼樹是由 Subversion 管理,則使用
svn
命令列工具。CTest
模組變數:SVNCOMMAND
SVNOptions
所有調用中,
SVNCommand
的命令列選項。CTest
模組變數:CTEST_SVN_OPTIONS
SVNUpdateOptions
更新原始碼時,
SVNCommand
的命令列選項。CTest
模組變數:SVN_UPDATE_OPTIONS
UpdateCommand
指定要使用的版本控制命令列工具,而不偵測管理原始碼樹的 VCS。
CTest
模組變數:當UPDATE_TYPE
為<vcs>
時為<VCS>COMMAND
,否則為UPDATE_COMMAND
UpdateOptions
UpdateCommand
的命令列選項。CTest
模組變數:當UPDATE_TYPE
為<vcs>
時為<VCS>_UPDATE_OPTIONS
,否則為UPDATE_OPTIONS
UpdateType
指定管理原始碼樹的版本控制系統(如果無法自動偵測)。值可以是
bzr
、cvs
、git
、hg
、p4
或svn
。
UpdateVersionOnly
指定您只希望版本控制更新命令找出目前簽出的版本,而不是更新到不同的版本。
UpdateVersionOverride
指定原始碼樹的目前版本。
當此變數設定為非空字串時,CTest 會回報您指定的值,而不是使用更新命令來找出目前簽出的版本。使用此變數會取代
UpdateVersionOnly
。與UpdateVersionOnly
類似,使用此變數會告知 CTest 不要將原始碼樹更新到不同的版本。
其他組態設定包括
NightlyStartTime
在
Nightly
儀表板模式中,指定「每日開始時間」。使用集中式版本控制系統(cvs
和svn
),Update
步驟會簽出截至此時間的軟體版本,以便多個用戶端選擇要測試的通用版本。這在分散式版本控制系統中沒有明確定義,因此會忽略此設定。CTest
模組變數:如果已設定則為NIGHTLY_START_TIME
,否則為CTEST_NIGHTLY_START_TIME
CTest 組態步驟¶
在 CTest 腳本中,ctest_configure()
命令會執行此步驟。命令的引數可以指定一些步驟設定。
組態設定包括
CTest 建置步驟¶
在 CTest 腳本中,ctest_build()
命令會執行此步驟。命令的引數可以指定一些步驟設定。
組態設定包括
DefaultCTestConfigurationType
當要啟動的建置系統允許在建置時選擇組態(例如,
Debug
、Release
)時,這會指定在未向 ctest 命令提供-C
選項時要建置的預設組態。如果MakeCommand
的值中出現,該值將會替換為${CTEST_CONFIGURATION_TYPE}
字面字串。CTest
模組變數:DEFAULT_CTEST_CONFIGURATION_TYPE
,由CMAKE_CONFIG_TYPE
環境變數初始化
LabelsForSubprojects
指定以分號分隔的標籤清單,這些標籤將被視為子專案。當提交組態、測試或建置結果時,此對應將會傳遞至 CDash。
CTest
模組變數:CTEST_LABELS_FOR_SUBPROJECTS
請參閱 標籤和子專案摘要。
MakeCommand
啟動軟體建置程序的命令列。它會在
BuildDirectory
設定指定的位置執行。CTest
模組變數:MAKECOMMAND
,由build_command()
命令初始化
UseLaunchers
對於由 CMake 使用其中一個 Makefile 產生器或
Ninja
產生器產生的建置樹狀結構,請指定是否透過CTestUseLaunchers
模組(也包含在CTest
模組中)啟用CTEST_USE_LAUNCHERS
功能。啟用後,產生的建置系統會使用「啟動器」包裝編譯器、連結器或自訂命令列的每個調用,啟動器會透過環境變數和檔案與 CTest 通訊,以回報細微的建置警告和錯誤資訊。否則,CTest 必須「刮取」建置輸出記錄以取得診斷資訊。CTest
模組變數:CTEST_USE_LAUNCHERS
CTest 測試步驟¶
在 CTest 腳本 中,ctest_test()
命令會執行此步驟。此命令的參數可以指定部分步驟設定。
組態設定包括
ResourceSpecFile
指定一個 資源規格檔案。
CTest
模組變數:CTEST_RESOURCE_SPEC_FILE
請參閱 資源分配 以取得更多資訊。
LabelsForSubprojects
指定以分號分隔的標籤清單,這些標籤將被視為子專案。當提交組態、測試或建置結果時,此對應將會傳遞至 CDash。
CTest
模組變數:CTEST_LABELS_FOR_SUBPROJECTS
請參閱 標籤和子專案摘要。
TestLoad
在並行執行測試時(例如,使用
-j
),嘗試在它們可能導致 CPU 負載超過給定閾值時不要啟動測試。CTest
模組變數:CTEST_TEST_LOAD
TimeOut
如果
TIMEOUT
測試屬性或--timeout
旗標未指定,則每個測試的預設逾時時間。CTest
模組變數:DART_TESTING_TIMEOUT
若要回報額外的測試值到 CDash,請參閱 額外的測試量測。
CTest 覆蓋率步驟¶
在 CTest 腳本 中,ctest_coverage()
命令會執行此步驟。此命令的參數可以指定部分步驟設定。
組態設定包括
CTest 記憶體檢查步驟¶
在 CTest 腳本 中,ctest_memcheck()
命令會執行此步驟。此命令的參數可以指定部分步驟設定。
組態設定包括
MemoryCheckCommand
用於執行動態分析的命令列工具。測試命令列將透過此工具啟動。
CTest
模組變數:MEMORYCHECK_COMMAND
MemoryCheckCommandOptions
指定
MemoryCheckCommand
工具的命令列選項。它們將放置在測試命令列之前。CTest
模組變數:MEMORYCHECK_COMMAND_OPTIONS
MemoryCheckType
指定要執行的記憶體檢查類型。
CTest
模組變數:MEMORYCHECK_TYPE
MemoryCheckSanitizerOptions
在使用已啟用清理程式的版本執行時,指定清理程式的選項。
CTest
模組變數:MEMORYCHECK_SANITIZER_OPTIONS
MemoryCheckSuppressionFile
指定一個包含
MemoryCheckCommand
工具的抑制規則的檔案。它將透過適用於該工具的選項傳遞。CTest
模組變數:MEMORYCHECK_SUPPRESSIONS_FILE
其他組態設定包括
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
用簡短的字串描述儀表板用戶端平台。(作業系統、編譯器等)
CTest
模組變數:BUILDNAME
CDashVersion
舊版選項。不使用。
CTestSubmitRetryCount
指定在網路失敗時重試提交的次數。
CTest 腳本變數:無,使用
ctest_submit()
RETRY_COUNT
選項。CTest
模組變數:CTEST_SUBMIT_RETRY_COUNT
CTestSubmitRetryDelay
指定在網路失敗時重試提交之前的延遲時間。
CTest 腳本變數:無,使用
ctest_submit()
RETRY_DELAY
選項。CTest
模組變數:CTEST_SUBMIT_RETRY_DELAY
CurlOptions
自 3.30 版本起已棄用:請改用
TLSVerify
。指定一個以分號分隔的選項列表,用於控制 CTest 內部用來連線到伺服器的 Curl 函式庫。
CTest
模組變數:CTEST_CURL_OPTIONS
可用的選項有
CURLOPT_SSL_VERIFYPEER_OFF
停用
CURLOPT_SSL_VERIFYPEER
curl 選項。CURLOPT_SSL_VERIFYHOST_OFF
停用
CURLOPT_SSL_VERIFYHOST
curl 選項。
DropLocation
舊版選項。當
SubmitURL
未設定時,它會從DropMethod
、DropSiteUser
、DropSitePassword
、DropSite
和DropLocation
建構而來。CTest
模組變數:如果已設定,則為DROP_LOCATION
,否則為CTEST_DROP_LOCATION
DropMethod
舊版選項。當
SubmitURL
未設定時,它會從DropMethod
、DropSiteUser
、DropSitePassword
、DropSite
和DropLocation
建構而來。CTest
模組變數:如果已設定,則為DROP_METHOD
,否則為CTEST_DROP_METHOD
DropSite
舊版選項。當
SubmitURL
未設定時,它會從DropMethod
、DropSiteUser
、DropSitePassword
、DropSite
和DropLocation
建構而來。CTest
模組變數:如果已設定,則為DROP_SITE
,否則為CTEST_DROP_SITE
DropSitePassword
舊版選項。當
SubmitURL
未設定時,它會從DropMethod
、DropSiteUser
、DropSitePassword
、DropSite
和DropLocation
建構而來。CTest
模組變數:如果已設定,則為DROP_SITE_PASSWORD
,否則為CTEST_DROP_SITE_PASWORD
DropSiteUser
舊版選項。當
SubmitURL
未設定時,它會從DropMethod
、DropSiteUser
、DropSitePassword
、DropSite
和DropLocation
建構而來。CTest
模組變數:如果已設定,則為DROP_SITE_USER
,否則為CTEST_DROP_SITE_USER
IsCDash
舊版選項。不使用。
CTest
模組變數:CTEST_DROP_SITE_CDASH
ScpCommand
舊版選項。不使用。
CTest
模組變數:SCPCOMMAND
Site
用簡短的字串描述儀表板用戶端主機站點。(主機名稱、網域等)
CTest
模組變數:SITE
,由site_name()
命令初始化
SubmitURL
用於將提交傳送至的儀表板伺服器的
http
或https
URL。CTest
模組變數:SUBMIT_URL
(如果已設定),否則為CTEST_SUBMIT_URL
SubmitInactivityTimeout
提交後等待逾時的時間,若未完成則取消提交。指定零值以停用逾時。
CTest
模組變數:CTEST_SUBMIT_INACTIVITY_TIMEOUT
TLSVersion
於版本 3.30 中新增。
指定透過
https://
URL 提交至儀表板時允許的最低 TLS 版本。CTest
模組變數:CTEST_TLS_VERSION
變更於版本 3.31:預設為 TLS 1.2。先前,預設情況下不強制執行最低版本。
TLSVerify
於版本 3.30 中新增。
指定布林值,指出透過
https://
URL 提交至儀表板時是否驗證伺服器憑證。CTest
模組變數:CTEST_TLS_VERIFY
變更於版本 3.31:預設為啟用。先前,預設為停用。使用者可以設定
CMAKE_TLS_VERIFY
環境變數為0
以還原舊的預設值。TriggerSite
舊版選項。不使用。
CTest
模組變數:TRIGGER_SITE
(如果已設定),否則為CTEST_TRIGGER_SITE
顯示為 JSON 物件模型¶
於版本 3.14 中新增。
當給定 --show-only=json-v1
命令列選項時,測試資訊會以 JSON 格式輸出。JSON 物件模型的 1.0 版定義如下
kind
字串 "ctestInfo"。
version
指定版本組件的 JSON 物件。其成員為
major
指定主要版本組件的非負整數。
minor
指定次要版本組件的非負整數。
backtraceGraph
使用下列成員表示回溯資訊的 JSON 物件
commands
命令名稱列表。
files
檔案名稱列表。
nodes
包含成員的節點 JSON 物件列表
command
指向
backtraceGraph
的commands
成員的索引。file
指向
backtraceGraph
的files
成員的索引。line
新增回溯的檔案中的行號。
parent
指向
backtraceGraph
的nodes
成員的索引,表示圖形中的父節點。
tests
列出每個測試相關資訊的 JSON 陣列。每個項目都是具有下列成員的 JSON 物件
name
測試名稱。
config
測試可以執行的組態。空字串表示任何組態。
command
第一個元素為測試命令的列表,其餘元素為命令引數。
backtrace
指向
backtraceGraph
的nodes
成員的索引。properties
測試屬性。可以包含每個受支援測試屬性的索引鍵。
資源配置¶
CTest 提供了一種機制,讓測試以細緻的方式指定它們需要的資源,並讓使用者指定正在執行機器上的可用資源。這讓 CTest 可以在內部追蹤哪些資源正在使用中以及哪些資源是空閒的,並以一種防止測試嘗試取得不可用資源的方式來排程測試。
當使用資源配置功能時,CTest 不會過度訂閱資源。例如,如果某個資源有 8 個插槽,CTest 一次不會執行總共使用超過 8 個插槽的測試。即使使用高的 -j
引數,但如果這些測試都使用來自相同資源的某些插槽,這也會限制在任何給定時間可以執行多少測試。此外,這也表示如果單一測試使用的資源超過機器上的可用資源,則完全不會執行該測試(且會回報為 未執行
)。
此功能的常見使用案例是針對需要使用 GPU 的測試。多個測試可以同時從 GPU 配置記憶體,但如果太多測試嘗試同時執行此操作,則其中一些測試將無法配置,導致測試失敗,即使測試在具有所需的記憶體時會成功。透過使用資源配置功能,每個測試都可以指定其從 GPU 需要多少記憶體,這讓 CTest 可以以同時執行多個測試不會耗盡 GPU 記憶體集區的方式來排程測試。
請注意,CTest 沒有 GPU 的概念,也不知道它有多少記憶體。它沒有任何與 GPU 通訊以檢索此資訊或執行任何記憶體管理的方式,雖然專案可以定義一個提供測試機器詳細資訊的測試(請參閱動態產生資源規格檔案)。
CTest 會追蹤抽象資源類型清單,每個類型都有一定數量的插槽供測試使用。每個測試都會指定其需要來自某個資源的插槽數量,然後 CTest 會以防止使用中的插槽總數超過所列容量的方式來排程它們。當執行測試且資源的插槽配置給該測試時,測試可能會假設在測試處理程序的持續時間內,它們擁有這些插槽的專屬使用權。
CTest 資源配置功能至少包含兩個輸入
以下說明的資源規格檔案,說明系統上可用的資源。
測試的
RESOURCE_GROUPS
屬性,說明測試所需的資源。
當 CTest 執行測試時,分配給該測試的資源會以一組環境變數的形式傳遞,如下所述。使用此資訊來決定要連線到哪個資源,這取決於測試編寫者。
RESOURCE_GROUPS
屬性會告知 CTest 測試預期使用哪些資源,並以對測試有意義的方式分組。測試本身必須讀取環境變數,以判斷已將哪些資源配置給每個群組。例如,每個群組可能對應於執行時測試會產生的處理程序。
請注意,即使測試指定了 RESOURCE_GROUPS
屬性,如果使用者沒有傳遞資源規格檔案,該測試仍有可能在沒有任何資源分配(以及沒有相應的環境變數)的情況下執行。透過 --resource-spec-file
命令列引數或 RESOURCE_SPEC_FILE
引數傳遞此檔案給 ctest_test()
,才能啟用資源分配功能。測試應檢查 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
}
]
}
]
}
其成員為
version
一個包含
major
整數字段和minor
整數字段的物件。目前,唯一支援的版本是 major1
,minor0
。任何其他值都是錯誤。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 上的記憶體大小(MB),或加密晶片上可用的加密單元數量。如果未指定
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 從 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
屬性中必須只有一個 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 的協助:
- 首頁
-
學習 CMake 的主要起點。
- 線上文件與社群資源
https://cmake.dev.org.tw/documentation
此網頁上可以找到可用文件和社群資源的連結。
- Discourse 論壇
-
Discourse 論壇託管關於 CMake 的討論和問題。