Test::Builder::Tester - 測試使用 Test::Builder 建置的測試套件
use Test::Builder::Tester tests => 1;
use Test::More;
test_out("not ok 1 - foo");
test_fail(+1);
fail("foo");
test_test("fail works");
一個模組,協助您測試使用 Test::Builder 建置的測試模組。
測試系統設計為執行三步驟程序,以測試您想要測試的每個測試。此程序從使用 test_out
和 test_err
開始,預先宣告您正在測試的測試套件將使用 Test::Builder 輸出到標準輸出和標準錯誤輸出。
然後您可以執行呼叫 Test::Builder 的測試套件中的測試。此時,Test::Builder 的輸出會安全地由 Test::Builder::Tester 擷取,而不是被解釋為實際的測試輸出。
最後一個階段是呼叫 test_test
,它會簡單地比較您預先宣告的內容和 Test::Builder 實際輸出的內容,並將結果以「ok」或「not ok」(含偵錯)回報到正常輸出。
以下六個方法預設匯出。
在呼叫 test_test
之前,預先宣告測試套件預期產生的輸出的程序。這些程序會自動假設每一行都以「\n」結尾。因此
test_out("ok 1","ok 2");
與
test_out("ok 1\nok 2");
相同,甚至與
test_out("ok 1");
test_out("ok 2");
相同。呼叫 test_out
或 test_err
(或 test_fail
或 test_diag
)後,Test::Builder 的所有進一步輸出都會由 Test::Builder::Tester 擷取。這表示在呼叫 test_test
之前,你無法以正常的方式對正常輸出執行進一步的測試(除非你手動處理輸出檔案處理器)
由於 Test::Builder 在測試失敗時產生的標準失敗訊息會在你的測試錯誤輸出中經常出現,而且在 Test::Builder 版本之間有所變更,因此,與其強制你一直使用字串呼叫 test_err
,如下所示
test_err("# Failed test ($0 at line ".line_num(+1).")");
test_fail
是一個方便函式,可以用來代替呼叫。它只有一個引數,即導致失敗的行與目前行的偏移量。
test_fail(+1);
這表示可以將概要中的範例改寫得更簡單,如下所示
test_out("not ok 1 - foo");
test_fail(+1);
fail("foo");
test_test("fail works");
由於大部分預期的剩餘錯誤串流輸出會由 Test::Builder 的 diag
函式產生,因此,Test::Builder::Tester 提供了一個方便函式 test_diag
,你可以使用它來取代 test_err
。
test_diag
函式會在傳遞給它的預期輸出開頭加上註解雜湊和空白,並在結尾加上換行符號,然後將其新增至預期的錯誤輸出清單。因此,與撰寫
test_err("# Couldn't open file");
相同,你可以撰寫
test_diag("Couldn't open file");
請記住,Test::Builder 的 diag 函式不會在輸出的結尾加上換行符號,但 test_diag 會。因此,若要檢查
Test::Builder->new->diag("foo\n","bar\n");
你可以執行
test_diag("foo","bar")
,而不加上換行符號。
實際執行輸出檢查,測試測試,將我們從 Test::Builder 擷取的資料(使用 eq
)與使用 test_out
和 test_err
宣告的資料進行比較。
這會採用影響測試執行的名稱/值配對。
將在 ok
或 not ok
之後顯示的測試名稱。
將此設定為 true 值,測試會忽略測試傳送至輸出串流的輸出是否與使用 test_out
宣告的輸出相符。
將此設定為 true 值,測試會忽略測試傳送至錯誤串流的輸出是否與使用 test_err
宣告的輸出相符。
為方便起見,如果只傳遞一個引數,則假設此引數為測試名稱(如上述範例所示)。
執行 test_test
後,測試輸出將重新導向回 Test::Builder 連接的原始檔案句柄(可能是 STDOUT 和 STDERR),表示您執行的任何進一步測試都會正常運作,並會為 Test::Harness 造成成功/錯誤。
傳回呼叫函式的行號的公用函式。您可以傳遞一個會新增至結果的偏移量。這對於找出包含行號的診斷函式的正確文字非常有用。
這基本上與 __LINE__
巨集相同,但 line_num(+3)
慣用語可以說是比較好。
除了六個匯出的函式之外,還有一個函式只能使用完全限定的函式呼叫存取。
當呼叫 test_test
,而您的測試產生的輸出與您宣告的輸出不符時,test_test
會印出除錯資訊,顯示兩個衝突的版本。由於此輸出本身就是除錯資訊,因此可能會混淆 test_test
的輸出部分和原始測試的原始輸出部分。此外,可能很難發現行尾的額外空白等問題,即使輸出看起來很相似,也可能導致您的測試失敗。
為了協助您,test_test
可以為除錯資訊的背景著色,以區分不同類型的輸出。除錯輸出會將其背景著色為綠色和紅色。綠色部分代表執行輸出和實際輸出之間相同的文字,紅色部分顯示不同的部分。
color
函式會決定是否應進行著色。傳遞 true 或 false 值分別會啟用或停用著色,而未傳遞引數呼叫的函式會傳回目前的設定。
若要從命令列啟用著色,您可以使用 Text::Builder::Tester::Color 模組,如下所示
perl -Mlib=Text::Builder::Tester::Color test.t
或直接在 PERL5LIB 中包含 Test::Builder::Tester::Color 模組。
Test::Builder::Tester 無法妥善處理計畫。它從未對計畫做過任何特殊處理。這表示 Test::Builder::Tester 外部的計畫會影響 Test::Builder::Tester,更糟的是,使用 Test::Builder::Tester 時的計畫會影響整體測試。目前沒有計畫要修正此錯誤,因為人們已開始依賴它,而且 Test::Builder::Tester 現在已不建議使用,建議改用 Test2::API::intercept()
。請參閱 https://github.com/Test-More/test-more/issues/667
呼叫 Test::Builder->no_ending
以關閉結束測試。這有其必要,否則它會跳出,因為我們執行的測試比我們嚴格來說應該執行的多,而且它會將我們測試的任何失敗註冊為真正的失敗。
色彩功能只有在 Term::ANSIColor 與您的終端機相容時才會運作。此外,在 Windows 平台上必須安裝 Win32::Console::ANSI 才能輸出色彩。
錯誤(以及新功能要求)可透過 GitHub 向作者回報:https://github.com/Test-More/test-more/issues
版權所有 Mark Fowler <mark@twoshortplanks.com> 2002、2004。
部分程式碼取自 Test::More 和 Test::Catch,由 Michael G Schwern <schwern@pobox.com> 編寫。因此,那些部分的版權屬於 Micheal G Schwern 2001。經許可使用和散布。
此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
感謝 Richard Clamp <richardc@unixbeard.net> 讓我使用他的測試系統來試用此模組。