在Perl中测试Test :: More的多个测试用例之间进行拆分

时间:2012-05-27 19:03:31

标签: perl unit-testing tdd

我有一个perl子例程,它应该返回ab之间的素数。我在testSub.t中对此进行了测试:

 
my $arrayref = MyPackage::generatePrimes(1,2);

my @array = @$arrayref;
is ( scalar(@array), 1, "One primes between (1,2)");

我需要使用其他一些输入(MyPackage::generatePrimes1..3等)重新运行10..15。我可以这样做:


my $arrayref;
my @array;

# Test between (1,2)
$arrayref = MyPackage::generatePrimes(1,2); 
@array = @$arrayref;
is ( scalar(@array), 1, "One primes between (1,2)");

# Test between (1,3)
$arrayref = MyPackage::generatePrimes(1,3);
@array = @$arrayref;
is ( scalar(@array), 2, "Two primes between (1,3)");

在这种情况下工作正常。但是,如果我有一些稍微复杂的例程和测试,那么这似乎不是 clean ,因为当我重新使用变量时,测试之间可能会有泄漏。

添加第二个测试的正确(“干净”)方法是什么?有没有一种干净的方法在testSub.t中执行此操作(拆除arrayref以及在我再次测试子例程之前由上述测试生成的其他变量),或者我只是在{中编写另一个测试{1}}?

2 个答案:

答案 0 :(得分:1)

您可以简单地将测试代码包装在子例程中。

#!/usr/bin/perl

use strict ;
use warnings ;
use Test::More ;
use MyPackage ;

#             from, to, primes
my @tests = ( [ 1 , 2 , 2 ] ,
              [ 1 , 3 , 3 ] ) ;
# Just add new tests as needed

plan tests => @tests ;

foreach my $test ( @tests ) {
  do_the_test( $test ) ;
}

sub do_the_test {
  my @args = @{ $_[0] } ;

  my @array = @{ MyPackage::generatePrimes( @args[0..1] ) } ;
  is( scalar @array , $args[2] ,
      sprintf( "Primes between (%d,%d): %d" , @args ) ) ;
}

由于每个测试都在子程序内,因此测试彼此分开 如果你有更多的参数需要传递给你的子程序,你应该考虑在哈希中传递参数。

答案 1 :(得分:1)

不要复制到另一个阵列。

<击>是(@#{$数组引用} +1,2)

is($#{$arrayref}+1,2)

或者,将您的分配包装在do块中。

do {
    my @array = @( my_function());
    is( scalar( @array),2 );
}

@array的分配范围在块内。