IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Perlでインクリメンタルテスト

この前Perlでテストプログラムを書いていたのですが、テスト対象プログラムにて読み込んでいる設定ファイルがたくさんあり、その読み込みに1秒から2秒ほど時間がかかり、テストがサクサクできませんでした。1,2秒我慢できないのかと言われてしまいますが、心の小さい人間なので。。。

もちろん、テスト対象として使わない設定ファイルは外せばよいのですが、設定ファイルは開発全体で共通して使っているのでいじりたくはありませんし、各設定ファイルの詳細まで把握していないので、どれが不必要かわからない状態でした。

設定ファイルだけは先に読み込まれた状態で、テストクラスを実行できたら良いのではと思い、下記のコードを書いてみました。

テストプログラムを監視するプログラムを用意します。監視するプログラムにて、あらかじめ設定ファイルを読み込んでおいて、テストプログラムが更新されたら、それを読み取りevalで実行するというものです。

 

テストプログラムを監視するプログラム 

use strict;
use warnings;
use List::Util qw{max min sum shuffle};

my $f = $ARGV[0];

print $f . "\n";
my $lt = -M $f;
while(1){
  my $t = -M $f;
  if($lt != $t) {
    open my $fh, '<', $f;
    my $c = do {local $/; <$fh>};
    print "\n --" . (scalar localtime) . "\n";
    eval $c;
    if($@){print $@;}
    $lt = $t;
  }
  sleep 1;
}

 

テストプログラムは

use Test::More;

my $array = [1,2,3];
my $total = sum @$array;
is($total,6);

 

テストプログラムを保存するたびにテストが実行されるので、インクリメンタルコンパイルならぬインクリメンタルテストでしょうか。