15.測試套件的支援
本系列文章均翻譯自Automake官方文件:Automake Manual,github同步專案:question
測試套件由一系列的測試用例組成。
Automake可以生成程式碼來處理兩種測試套件。
- 基於和
dejagnu
框架整合。 - 基於通用測試指令碼,通過定義特殊變數
TESTS
啟用。好像不支援萬用字元。
第二種允許併發執行測試指令碼,使用已有的測試協議(例如TAP),以及自定義測試驅動程式和測試執行程式。
在任何情況下,通過make check
呼叫測試套件。
一些說明:
跳過測試(skipped):測試沒有意義,測試條件不滿足。
硬錯誤(hard error
預期失敗expected failure (xfail),未預計的通過unexpected pass (xpass)。
15.2 簡單測試
15.2.1 基於指令碼的測試套件
如果TESTS
變數被定義了,其值是執行測試的程式或指令碼列表。
測試指令碼可以並行或序列執行,預設的是並行測試套件。
預設的測試結果是測試指令碼的退出結果。
Automake也支援更多的協議:standard (see Using the TAP test protocol) 和 custom (see Custom Test Drivers)。
note:不能在序列中使用這些協議。
不使用測試協議的時候,測試指令碼的退出碼的意義如下:
- 0 - 成功
- 77 - 跳過該測試
- 99 - 硬錯誤
- 其它 - 失敗
可以使用XFAIL_TESTS
變數列出xfail的測試,它是TESTS
的子集。定義DISABLE_HARD_ERRORS
變數為非空值來項普通的錯誤一樣對待硬錯誤。
note:使用測試協議的時候,這兩個變數不會起作用。
PASS: foo.sh PASS: zardoz.tap 1 - Daemon started PASS: zardoz.tap 2 - Daemon responding SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted PASS: zardoz.tap 4 - Daemon stopped SKIP: bar.sh PASS: mu.tap 1 XFAIL: mu.tap 2 # TODO frobnication not yet implemented
AM_COLOR_TESTS=always
,彩色輸出。
AM_TESTS_ENVIRONMENT
與 TESTS_ENVIRONMENT
變數用於給測試指令碼執行初始化程式碼和設定環境變數。前者是開發人員保留的,後者是使用者保留的(可擴充套件並且覆蓋前者的設定)。非空的AM_TESTS_ENVIRONMENT
必須以分號結束,且不支援序列測試。
Automake會保證每個在TEST
中列出的檔案在執行之前被構建。
在check_primary
中列出的測試程式之在make check
的時候構建,而不是在make all
期間。
15.2.2 序列測試
強烈不推薦使用。
通過Automake選項serial-tests實現序列測試
15.2.3 並行測試
make -j執行並行測試。
make -j3 check
標準錯誤與標準輸出重定向到每個測試的.log
檔案,結果在.trs
檔案。失敗的測試收集在test-suite.log檔案中。
自定義測試程式;沒有註冊的副檔名的測試,會使用變數LOG_COMPILER, AM_LOG_FLAGS, and LOG_FLAGS
:
TESTS = foo.pl bar.py baz
TEST_EXTENSIONS = .pl .py
PL_LOG_COMPILER = $(PERL)
AM_PL_LOG_FLAGS = -w
PY_LOG_COMPILER = $(PYTHON)
AM_PY_LOG_FLAGS = -v
LOG_COMPILER = ./wrapper-script
AM_LOG_FLAGS = -d
可以使用:
來保證測試的依賴關係
TESTS = foo-compile.test foo-execute.test
foo-execute.log: foo-compile.log
note:只保證順序,不保證結果。即無論foo-compile.test是否成功,都會繼續執行foo-execute.log。
15.3 自定義測試驅動程式
15.3.1 概述
自定義的測試程式的預期是:正確地執行傳遞給它的測試程式(包括命令列傳遞給測試程式的引數),分析它們的執行和結果,建立相關的.log
和.trs
檔案,在控制檯顯示測試結果。
如何確定和分析測試指令碼結果的確切細節由各個驅動程式決定。
即使使用自定義的測試驅動程式,並行測試的大部分功能仍然要實現;包括以下幾點:
- 在
TESTS
中定義測試指令碼,並在執行時可通過TESTS
或TEST_LOGS
覆蓋。 - 通過使用make的選項-jN,併發執行。
- 每個測試的
.log
、.trs
檔案,還有摘要的.log
檔案。 recheck
目標,RECHECK_LOGS
變數,測試懶重新執行。- 測試間的依賴關係。
- 對
check_*
變數的支援(check_PROGRAMS, check_LIBRARIES, …)。 - 使用
VERBOSE
環境變數獲取測試套件失敗的詳細輸出。 - 定義
TESTS_ENVIRONMENT, AM_TESTS_ENVIRONMENT and AM_TESTS_FD_REDIRECT
變數。 - 通用定義和擴充套件定義
LOG_COMPILER
和LOG_FLAGS
變數。
15.3.2 宣告驅動
通過定義make變數LOG_DRIVER
或ext_LOG_DRIVER
(ext必須在TEST_EXTENSIONS
中宣告)來宣告自定義的測試套件驅動。
開發者保留變數AM_DRIVER_FLAGS
和使用者保留變數LOG_DRIVER_FLAGS
可被用於定義flags,會被傳給每個LOG_DRIVER
呼叫。類似的,對於每個在TEST_EXTENSIONS
中宣告的擴充套件ext,在AM_ext_LOG_DRIVER_FLAGS
和ext_LOG_DRIVER_FLAGS
中列出的flags會被傳遞給ext_LOG_DRIVER
。
15.3.3 定製測試驅動的 API
pass
15.4 TAP 測試協議
15.4.1 介紹
TAP, the Test Anything Protocol,是一個簡單的基於文字的在測試模組(或程式)與測試工具之間的介面。
The tests (TAP producers) 向標準輸出中以一種簡單的格式寫入測試結果; a test harness (TAP consumer)會解析和解釋這些結果,正確地呈現給使用者,並且/或者為稍後的分析註冊結果。
15.4.2 結合Automake測試工具使用
目前Automake附帶的TAP驅動程式需要一些手動配置。必須從Automake的發行版中獲取tap-driver.sh
指令碼,複製到原始碼目錄,然後使用Automake支援的第三方測試驅動來指導工具倆使用該指令碼和AM_INIT_AUTOMAKE
發現的awk程式來執行自己的TAP-producing測試。
除了通用的Automake測試驅動選項,tap-driver.sh
還支援以下選項:
- –ignore-exit 忽視測試指令碼的退出狀態;預設情況下,如果指令碼以非零狀態退出,驅動會報告一個錯誤。
- –comments 指示測試驅動程式在測試套件的輸出也顯示TAP註釋(即以
#
開頭的行)。預設情況下,註釋只會複製到.log
檔案。 - –no-comments
- –merge 指示測試驅動合併測試指令碼的標準錯誤到他們的標準輸出。如果你想保證測試指令碼中的註釋與測試結果一起顯示,該選項是必須的。
- –no-merge
- –diagnostic-string=STRING 改變註釋的符號:
#
->STRING
。非TAP官方標準。