2009-11-06 50 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%好
(等等等等等)

这是一个非常有用的工具。 :)