![]() |
Boost.Build 對執行單元測試提供了便捷的支援。最簡單的方式是使用 `unit-test` 規則,它遵循通用語法。例如:
unit-test helpers_test : helpers_test.cpp helpers ;
`unit-test` 規則的行為類似於exe規則,但在建立可執行檔後,它也會執行該檔案。如果可執行檔返回錯誤碼,建置系統也會返回錯誤,並會在下次調用時嘗試執行該可執行檔,直到它成功執行為止。這種行為確保您不會錯過任何單元測試失敗。
以下列出了一些專門的測試規則:
rule compile ( sources : requirements * : target-name ? ) rule compile-fail ( sources : requirements * : target-name ? ) rule link ( sources + : requirements * : target-name ? ) rule link-fail ( sources + : requirements * : target-name ? )
它們會被賦予一個來源檔案和需求的列表。如果未提供目標名稱,則會使用第一個來源檔案的名稱作為目標名稱。`compile*` 測試會嘗試編譯傳入的來源檔案。`link*` 規則會嘗試從所有傳入的來源檔案編譯和連結應用程式。`compile` 和 `link` 規則預期編譯/連結成功。`compile-fail` 和 `link-fail` 規則則預期編譯/連結失敗。
有兩個專門用於執行應用程式的規則,它們比 `unit-test` 規則更強大。`run` 規則具有以下簽章:
rule run ( sources + : args * : input-files * : requirements * : target-name ? : default-build * )
該規則會從提供的來源檔案建置應用程式並執行它,將 `args` 和 `input-files` 作為命令列引數傳遞。`args` 參數會逐字傳遞,而 `input-files` 參數的值會被視為相對於包含 Jamfile 的路徑,並且如果從不同的目錄調用 **b2**,則會進行調整。`run-fail` 規則與 `run` 規則相同,只是它預期執行失敗。
本節中描述的所有規則,如果成功執行,都會建立一個特殊的清單檔案,以指示測試通過。對於 `unit-test` 規則,該檔案名為 *`目標名稱`*.passed,而對於其他規則,該檔案名為 *`目標名稱`*.test。`run*` 規則還會擷取程式的所有輸出,並將其儲存在名為 *`目標名稱`*.output 的檔案中。
如果 `preserve-test-targets` 功能的值為 `off`,則 `run` 和 `run-fail` 規則將在執行可執行檔後將其移除。這在一定程度上減少了持續測試環境的磁碟空間需求。`preserve-test-targets` 功能的預設值為 `on`。
可以透過傳遞 `--dump-tests` 命令列選項來列印專案中宣告的所有測試目標(`unit-test` 除外)的列表。輸出將包含以下形式的行:
boost-test(test-type
)path
:sources
可以將測試列表、Boost.Build 輸出以及測試通過時建立的 *.test 檔案是否存在/不存在處理為易於理解的測試狀態表。Boost.Build 中不包含此類處理工具。
以下功能調整測試元目標的行為。
testing.arg
定義在輸入檔案列表之前執行目標時要傳遞的參數。
unit-test helpers_test
: helpers_test.cpp helpers
: <testing.arg>"--foo bar"
;
testing.input-file
指定要在參數之後於命令列傳遞給可執行檔的檔案。由於目前實作的限制,所有檔案必須按字母順序指定。
testing.launcher
預設情況下,可執行檔會直接執行。有時,希望使用一些輔助命令來執行可執行檔。您應該使用此屬性來指定輔助命令的名稱。例如,如果您寫入
unit-test helpers_test
: helpers_test.cpp helpers
: <testing.launcher>valgrind
;
用於執行可執行檔的命令將是
valgrind bin/$toolset/debug/helpers_test
test-info
測試的描述。這會顯示為 `--dump-tests` 命令列選項的一部分。