1. 程式人生 > >15.測試套件的支援

15.測試套件的支援

本系列文章均翻譯自Automake官方文件:Automake Manual,github同步專案:question

測試套件由一系列的測試用例組成。

Automake可以生成程式碼來處理兩種測試套件。

  1. 基於和dejagnu框架整合。
  2. 基於通用測試指令碼,通過定義特殊變數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_ENVIRONMENTTESTS_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中定義測試指令碼,並在執行時可通過TESTSTEST_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_COMPILERLOG_FLAGS變數。

15.3.2 宣告驅動

通過定義make變數LOG_DRIVERext_LOG_DRIVERext必須在TEST_EXTENSIONS中宣告)來宣告自定義的測試套件驅動。

開發者保留變數AM_DRIVER_FLAGS和使用者保留變數LOG_DRIVER_FLAGS可被用於定義flags,會被傳給每個LOG_DRIVER呼叫。類似的,對於每個在TEST_EXTENSIONS中宣告的擴充套件ext,在AM_ext_LOG_DRIVER_FLAGSext_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官方標準。