App::Prove::Plugin::MySQLPoolによるプーリング
mysqldの起動時間を短くする方法を挙げましたが,App::Prove::Plugin::MySQLPool
は,prove
向けのプラグインモジュールです。
使用するには,prove
の起動時に指定します。
$ prove -PMySQLPool t/something.t
テストファイルの中では,
my $dbh = DBI->connect($ENV{PERL_TEST_MYSQLPOOL_DSN});
テストファイルごとにmysqldが起動せず,
mysqldのプーリングを行う際の注意点
mysqldプロセスを再利用することに関して注意点があります。それは,
テーブルは流用できるので,fail
することが考えられます。
そのため,
あるいは,DBIx::TransactionManager
を用いれば,
プーリングされたmysqldの初期化
そこで提案したいのが,
以下は,DBIx::Inspector
を使用して,
use DBIx::Inspector;
my $inspector = DBIx::Inspector->new(dbh => $dbh);
my @tables = $inspector->tables;
for my $table (@tables) {
my $table_name = $table->name;
$dbh->do("TRUNCATE TABLE $table_name")
or die $dbh->errstr;
}
トランザクションを実行してロールバックするのに比べて時間はかかりますが,
Harrietを用いてプーリングを行う
App::Prove::Plugin::MySQLPool
は簡単にmysqldプロセスを再利用できるモジュールですが,copy_
などのオプションには対応していない点,
mysqldをプーリングするには,Harriet
を使う方法もあります。Harriet
はApp::Prove::Plugin::MySQLPool
と同様,prove
のプラグインとして動作するモジュールです。ただし,
mysqld専用であるApp::Prove::Plugin::MySQLPool
と比べて,Harriet
では余計にコードを書く必要がありますが,
Harrietの使用例
使用するには,t/
に次のコードを書きます。
use Harriet;
use Test::mysqld;
$ENV{TEST_MYSQLD_DSN} ||= do {
my $mysqld = Test::mysqld->new(
# 前述したスクリプトで作った
# 事前作成ディレクトリを指定できる
copy_data_from => ...,
);
$HARRIET_GUARDS::TEST_MYSQLD = $mysqld;
$mysqld->dsn;
};
そして,
$ prove -PHarriet t/something.t
テストの中では,App::Prove::Plugin::MySQLPool
のときと同様,TEST_
にDSNが入ります。これを用いて$dbh
を作ればMySQLにつなぐことができます。
Harrietを使用した場合の注意点と解決策
ただし,
- mysqldを
t/
の中で複数個立てておき,harriet/ mysqld. pl ワーカごとに分散させる - 1つのmysqldの中に複数個のデータベースを用意して,
ワーカごとに使う
などの手法が考えられます。
Test::mysqld
には複数個のmysqldを一気に起動するstart_
メソッドがあるため,
ただ,
- pidで使うmysqldやデータベースを分ける
- 何らかのデータストアに使用されているmysqldやデータベースを保存しておき,
テストファイル起動時に未使用のデータベースを取得する prove
ではない並列実行を行う独自のテストコマンドを用いて,ジョブワーカ起動時にワーカ番号を環境変数で渡し, それによって使用するmysqldやデータベースを決定する
いずれもメリット/prove
を並列に走らせて結果を統合するコマンドであるgo-prove
を用いて実現しています。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.114
2019年12月23日発売
B5判/
定価
ISBN978-4-297-11109-0
-
特集1
安全運用のためのベストプラクティス!
AWS/GCPセキュア化計画
-
特集2
生体認証でさよならパスワード
作って学ぶWebAuthn -
特集3
カード発行,決済, 個人間送金の舞台裏
Kyash開発ノウハウ大公開 -
19周年記念エッセイ
経験,技術力の向上, 技術の進化を経た今, 思うこと
過去の自分へコードレビュー