【问题标题】:How can I automate a series of tests in Perl?如何在 Perl 中自动化一系列测试?
【发布时间】:2009-11-06 07:18:34
【问题描述】:

我,我必须在我的程序上运行大约 100 次测试,并且一个接一个地进行测试会浪费我的时间,所以我正在寻找编写一个脚本。 我这样写一个单独的测试

./program test_1 > out_1

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

diff -urpb expected_out_1 out_1 > diff_1

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

【问题讨论】:

    标签: perl testing


    【解决方案1】:

    您可能需要考虑重写您的测试,以使用在 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
    好的 2 - test_b
    ...
    ok 100 - zargle_fnargle

    或者您可以在 prove 之类的测试工具中运行它,这将在测试运行时为您提供一个很好的状态显示,并通过输出总结结果,例如

    100....好的
    所有测试均成功。
    Files=1, Tests=100, 200 挂钟秒 (blah blah blah)

    或许

    100....
    # 失败的测试'tricky_test'
    # 在 tests.t 第 7 行

    # 'another_tough_one' 测试失败
    # 在 tests.t 第 7 行

    # 看起来你在 100 次测试中失败了 2 次。
    死了。失败的测试 3、54
    2/100 测试失败,98.00% 正常
    (等等等等)

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

    【讨论】:

      【解决方案2】:
      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");
      }
      

      【讨论】:

        【解决方案3】:

        如果你喜欢 bash:

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

        【讨论】:

        • 不是所要求的编程语言,但是,哎呀,Bash 脚本是为了正是这个目的而存在的。
        【解决方案4】:

        试试这个:

        #!/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”的文件,其中包含一个逐行的测试列表,最后一行不为空。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-09-27
          • 1970-01-01
          • 2018-02-24
          • 1970-01-01
          • 2014-07-18
          • 1970-01-01
          • 1970-01-01
          • 2013-05-26
          • 1970-01-01
          相关资源
          最近更新 更多