RoadMovie

write down memos or something I found about tech things

Amon2でTest::mysqld

Amon2使ってるといいながらAmon2に関係すること書いてなかったので。。

環境:CentOS6.4

            Perl5.16.3 ( plenv )

            Amon2 ( flavor=basic )

            MySQL5.6.10

 

Test::mysqldのインストール

$ cpanm Test::mysqld

※ 実はここは超ハマったのですがまだちゃんと原因究明をできていないので後日。。

 

configにテスト環境を書いていきます。dbnameのところをTest::mysqldが生成するものを代入できるように下記のような感じで環境変数を受け取るようにしておきます。

$vim config/test.pl

  1 use File::Spec;
  2 use File::Basename qw(dirname);
  3 +{
  4     'DBI' => [
  5         $ENV{TEST_DSN},
  6         'root',
  7         '',
  8         +{
  9             mysql_enable_utf8 => 1,
 10         }
 11     ],
 12 };

 

次にtディレクトリ下にテストファイルを作ります。

$ vim t/test_mysql.t

  1 use strict;
  2 use warnings;
  3 use utf8;
  4 use Test::More;
  5 use DBI;
  6 use Test::mysqld;
  7 use App名;
  8 use Data::Dumper;
  9 use FindBin::libs;
 10
 11 BEGIN{ $ENV{PLACK_ENV} = 'test' };
 12
 13 my $c = App名->bootstrap;
 14
 15 use_ok("Test::mysqld");
 16
 17 my $mysqld = Test::mysqld->new(
 18     my_cnf => {
 19         'skip-networking' =>'',
 20     }
 21 ) or plan skip_all => $Test::mysqld::errstr;
 22
 23 $ENV{TEST_DSN} = $mysqld->dsn;
 24
 25 my $sql = "$FindBin::Bin/../sql/mysql.sql";
 26 system "mysql --socket $mysqld->{my_cnf}{socket} -uroot test < $sql";
 

11行目のBEGINで環境変数に'test'を代入してtest.plを参照するようにしています。

Amon2は自分の環境を$ENV{PLACK_ENV}で持っているのでそこに代入しています。

 

23行目で先ほどのconfigファイルで設定したところに$mysqld->dsnを代入していますが、これがTest::mysqldが自動生成してくれるdbの名前であったりsocketであったりの情報です。

 

26行目でシステムのコマンドを使ってデータ(テーブルのcreate情報など)を代入していますが、ここでソケットを設定しないと普段使っているmysqlのソケットを見に行って普段のDBの方のデータが変わってしまったりして元も子もないので注意です。

※ちなみに調べるとこういう現象もあるらしいので注意してください。

1スクリプト内で環境変数 PLACK_ENV を切り替える際の注意

 

あとは普通にアプリのルートディレクトリでproveなりperl -Ilibなりして実行してみてください。