Test::mysqld + perl -d を使うと SQLがそのまま叩けて便利
id:zigorou 先生に教えてもらった技をメモ。
(あとで調べてみたら http://perl-users.jp/articles/advent-calendar/2010/hacker/1 ですでに言及されていましたが、SQL叩けるというところだけ強調して再掲)
まずテストを用意します。
[kawamoto.m@mm1:~]$ cat 01.t use Test::More; use Test::mysqld; my $mysqld = Test::mysqld->new( my_cnf => { 'skip-networking' => '', # no TCP socket } ) or plan skip_all => $Test::mysqld::errstr; ok(1); done_testing;
perl -d でtestを走らせます。
[kawamoto.m@mm1:~]$ perl -d 01.t Loading DB routines from perl5db.pl version 1.33 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(01.t:4): my $mysqld = Test::mysqld->new( main::(01.t:5): my_cnf => { main::(01.t:6): 'skip-networking' => '', # no TCP socket DB<1> n main::(01.t:10): ok(1); DB<1> x $mysqld 0 Test::mysqld=HASH(0x100ba3908) '_owner_pid' => 63025 'auto_start' => 2 'base_dir' => '/tmp/93XStAoC1x' 'my_cnf' => HASH(0x100812500) 'datadir' => '/tmp/93XStAoC1x/var' 'pid-file' => '/tmp/93XStAoC1x/tmp/mysqld.pid' 'skip-networking' => '' 'socket' => '/tmp/93XStAoC1x/tmp/mysql.sock' 'mysql_install_db' => '/usr/local/bin/mysql_install_db' 'mysqld' => '/usr/local/bin/mysqld' 'pid' => 63071
このときsocketの値をコピーし、テスト実行停止中のまま別のターミナルから
$ mysql -uroot -S /tmp/93XStAoC1x/tmp/mysql.sock test
で接続すればテスト中のDBに普通に接続できます。当たり前といえば当たり前ですね。
普段print debugしてるよい子のみんなも Test::mysqld 使うときは debugger 使ったほうがいいですよー
これを使うとMySQLのテーブルの中を見通して眺めることができるので単純に効率良いし、関係ない値をうわがいてたとか、そういうしょうもないミスも減らすことができますね!
DB関連のテストをこんな感じでやっているうちに、MySQLと関係ないデバグもperl -dでスムーズにできるようになりました。あと身長伸びました。彼女も出来ました。 zigorou++