如何在Perl中自动执行一系列测试?

时间:2009-11-06 07:18:35

标签: perl testing

我,我必须在我的程序上运行大约100次测试并且逐个进行这样做会让我的时间变得糟糕,所以我希望编写一个脚本。 我写了一个像这样的单独测试

./program test_1 > out_1

然后将它与我正在寻找的输出进行比较

diff -urpb expected_out_1 out_1 > diff_1

有人可以帮我编写一个运行所有测试的简短Perl脚本。但请注意,上面的名称是占位符,我们无法对test_*进行循环。所有测试都有扩展X.test和相应的预期输出文件扩展名为X.out。 (注意名字是一样的)

4 个答案:

答案 0 :(得分: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
  好的1 - test_a
  ok 2 - test_b
  ...
  好的100 - zargle_fnargle

或者您可以在prove之类的测试工具中运行它,这将在测试运行时为您提供良好的状态显示,并使用

等输出汇总结果
  

100 .... OK
  所有测试都成功。
  Files = 1,Tests = 100,200 wallclock secs( blah blah blah

或者

  

100 ....
  #测试'tricky_test'失败了   #attest.t第7行

     

#Failed test'alve_tough_one'
  #attest.t第7行

     

#看起来你在100次测试中失败了。
  死了。失败测试3,54           2/100测试失败,98.00%没问题   (等等等)

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

答案 1 :(得分: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");
}

答案 2 :(得分: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 :(得分: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'的文件,它包含一行一行的测试列表,没有空的最后一行。

希望这有帮助。