2009-11-06 73 views
1

我,我必須在我的程序上運行大約100次測試,並且一個一個地執行它會讓我的時間很糟糕,所以我正在尋找一個腳本。 我寫的,像這樣如何在Perl中自動執行一系列測試?

 
./program test_1 > out_1

單獨的測試,然後把它比作是我期待的,像這樣

diff -urpb expected_out_1 out_1 > diff_1

能somebodyhelp我寫運行所有測試很短的Perl腳本輸出。但請注意,上面的名稱是佔位符,我們無法通過test_*進行循環。所有測試無論具有擴展X.test還是相應的預期輸出文件都具有擴展X.out。 (注意名稱是相同的)

回答

6
my @files = glob("*.test"); 

foreach my $file (@files) { 
    $file =~ /^(.*?)\.test$/; 
    my name = $1; 
    system("program $file > $name.out"); 
    system("diff -urpb expected_$name.out $name.out > $name.diff"); 
} 
+0

+1自動獲得測試文件:D – NawaMan 2009-11-06 07:35:50

+0

+1,因爲我同意NawaMan – 2009-11-06 09:41:39

1

試試這個:

#!/usr/bin/perl 

$TestProgram  = "./program"; 
$TestNames_FileName = "test.list"; 

# Read all Test names ++++++++++++++++++++++++++++ 
open(FILE, $TestNames_FileName); 
while (<FILE>) { 
    chomp; 
    $Command1 = "$TestProgram '$_.test' > '$_.out'"; 
    $Command2 = "diff -urpb '$_.expected_out' '$_.out' > '$_.diff'"; 
    system $Command1 
    system $Command2 
} 
close(FILE);

要運行這個,你需要一個名爲「test.list」由線包含測試線的列表,而空文件最後一行。

希望這會有所幫助。

4

,如果你喜歡的bash:

for i in `ls yourprogramfiles` 
do 
program $i >temp 
diff -urpb expected_out_1 temp > diff_1${i} 
rm -f temp 
done 
+3

不是所要求的編程語言,但是,Bash腳本就是爲了*完全*這個目的。 – Boldewyn 2009-11-06 07:46:08

11

你可能要考慮重寫你的測試,以充分利用其具有在Perl美妙支持Test Anything Protocol的。

use Test::More; 
my @files = glob("*.test"); 
plan tests => scalar @files; 
for my $file (@files) { 
    (my $name = $file) =~ s/\.test$//; 
    system("program $file > $name.out"); 
    is system("diff -urpb expected_$name.out $name.out > $name.diff"), 
    0, $name; 
} 

您可以直接運行這個 - TAP是人類可讀的,輸出會看起來像

1..100
OK 1 - test_a
確定2 - test_b
...
行100 - zargle_fnargle

,或者你可以在測試公頃內運行rness像prove,它會給你一個很好的狀態顯示,同時測試運行和總結結果與輸出像

100 .... OK
所有測試成功。
文件= 1,試驗= 100,200掛鐘秒(等等等等等等

或也許

100 ....
#測試失敗 'tricky_test'
# at test.t line 7

#失敗測試'another_tough_one'
#at tests.t line 7

#看起來像是你失敗了2次100次測試。
DIED。失敗的測試3,54
失敗2/100的測試中,98.00%好
(等等等等等)

這是一個非常有用的工具。 :)

相關問題