1

我有一个 perl 子程序,它应该返回介于两者之间的质ab。我对此进行了测试testSub.t

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

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

我需要MyPackage::generatePrimes使用其他一些输入(1..310..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)");

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

添加第二个测试的正确(“干净”)方法是什么?是否有一种干净的方法可以做到这一点testSub.t(在我再次测试子例程之前由上述测试生成的拆卸arrayref和其他变量),还是我只是在 中编写另一个测试testSub2.t

4

2 回答 2

1

不要复制到另一个数组。

是(@#{$arrayref}+1,2)

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

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

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

@array 的分配范围在块内。

于 2012-05-27T21:12:33.277 回答
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 ) ) ;
}

由于每个测试都在子程序内,因此测试彼此分开。
如果您有更多的参数必须传递给您的子例程,您应该考虑以散列的形式传递参数。

于 2012-05-27T20:56:57.097 回答