1

との間の素数の数を返す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)");

この場合、これは正常に機能します。ただし、少し複雑なルーチンとテストがある場合、変数を再利用するとテスト間にリークが発生する可能性があるため、これはあまりクリーンではないようです。

2番目のテストを追加するための正しい(「クリーンな」)方法は何ですか?これを行うためのクリーンな方法はありますか(サブルーチンを再度テストする前に上記のテストによって生成されたtestSub.t分解およびその他の変数)、または別のテストを書き込むだけですか?arrayreftestSub2.t

4

2 に答える 2

1

別のアレイにコピーしないでください。

is(@#{$ 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 に答える