2010-03-30 119 views
2

我想測試一下我用Perl編寫的腳本,並專門檢查它寫入文件的輸出。我前一段時間寫過,不想修改它以將其轉換爲模塊,但希望在添加一些小的功能更改之前對其進行迴歸測試。從Perl測試文件中,如何檢查文件的內容?

到目前爲止,我有

use Test::Command tests => 10; 

exit_is_num($cmd, 0); 
.... 

但命令會產生一些文件,我要檢查這些文件是相同的,因爲我希望(相等或匹配一些正則表達式)。 任何建議

+0

@Alex - 變化是什麼? – DVK 2010-03-30 17:29:57

回答

1

提到的方法沒有什麼神奇的有關試驗。閱讀文件,檢查他們是否有正確的內容。 Bog簡單。

open my $fh, $file; 
my $have = join '', <$fh>; 

is $have, <<'WANT', "contents of $file"; 
The quick brown fox 
jumped over the lazy grey dog. 
WANT 

沒有什麼地方打破那裏。 Test::File::Contents將爲您提供一些實用功能,因此您不必一遍又一遍地編寫它。

如果您正在測試一堆文件,則可以使流程數據驅動。

my %file_tests; 
$file_tests{"expected_filename"} = <<'WANT'; 
Expected content 
WANT 
... and so on ... 

for my $file (keys %file_tests) { 
    my $want = $file_tests{$file}; 

    file_contents_is($file, $want, "contents of $file"); 
} 

如果內容很大,您可能希望將預期輸出粘貼到文件中並使用files_contents_identical()。

最後,如果你想以確保程序只產生你所期望的文件,也沒有流浪狗,做一個臨時目錄,CHDIR成,從那裏運行程序,並檢查該目錄僅包含的文件,你期望。我將把它作爲讀者的練習。

2

好的,我會採用強力DIY方法(但可能已經有一些測試模塊與文件檢查API - 我從來沒有碰到一個靈活/通用的我們需要和自己寫從來沒有覺得迫切需要更深入地搜索:)。

我將描述一個相當通用的測試設置,您可能只需要/只需要非常特定的文件測試方面。

我們確實在這種情況下,什麼字面上就是你的功能規格以上的狀態,作爲整體的測試框架的一部分:

  • 有兩種方法(等等)一個測試庫 - test_file_identical()test_grep_file() 。如果您需要編寫這兩篇文章需要幫助,請發表評論,我會提供一些提示(我們使用不同的比較器,包括-e的組合,各種stat屬性的比較,比較測試文件的內容字符串與通過File::Slurp獲得的基準文件並對文件執行grep,一行一行或通過小文件的誹謗內容,包括將按摩grep結果與基準文件進行比較。

  • 將您的測試用例組織成子目錄(或tarball)測試,每個測試包含2個目錄 - 輸入文件和預期輸出文件。

  • 讓測試引擎腳本循環測試c ases(對於我們來說,它們是由Perl數據結構或者更好的元描述的,這是一個XML文件,所以業務分析師可以根據需要擺弄它們)。

  • 如果測試用例指定測試需要匹配(完全或通過grep),測試引擎會找到適當的文件(硬編碼名稱或通過測試用例中指定的名稱模式),應用這些文件測試在第一點