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++