我有一个perl子例程,它应该返回a
和b
之间的素数。我在testSub.t
中对此进行了测试:
my $arrayref = MyPackage::generatePrimes(1,2);
my @array = @$arrayref;
is ( scalar(@array), 1, "One primes between (1,2)");
我需要使用其他一些输入(MyPackage::generatePrimes
,1..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}}?
答案 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的分配范围在块内。