Test::mysqld で Q4M のテストを書く方法

yappo perl, test, memcached Test::memcached もほすい Test::Q4M もほすぃ Test::Pg もほすい

はてなブックマーク - yappoのブックマーク / 2009年8月10日

Test::Pg は書いた。memcached は個人的に需要がない。Q4M のテストなら、こんな感じで書けます。

use strict;
use warnings;

use DBI;
use Test::More;
use Test::mysqld;

my $mysqld = Test::mysqld->new(
    my_cnf => { skip_networking => '' },
) or plan skip_all => $Test::mysqld::errstr;

{ # setup
    my $dbh = DBI->connect(
        'DBI:mysql(PrintError=>0,RaiseError=>0):test;user=root;mysql_socket=' . $mysqld->base_dir
            . '/tmp/mysql.sock',
    ) or die $DBI::errstr;
    
    # check mysql version
    $dbh->selectrow_arrayref('SELECT version()')->[0] =~ /^5\.[1-9]/
        or plan skip_all => 'test requires mysql >= 5.1';
    
    # install q4m
    for my $cmd (
        q{INSTALL PLUGIN queue SONAME 'libqueue_engine.so'},
        q{CREATE FUNCTION queue_wait RETURNS INT SONAME 'libqueue_engine.so'},
        q{CREATE FUNCTION queue_end RETURNS INT SONAME 'libqueue_engine.so'},
        q{CREATE FUNCTION queue_abort RETURNS INT SONAME 'libqueue_engine.so'},
        q{CREATE FUNCTION queue_rowid RETURNS INT SONAME 'libqueue_engine.so'},
        q{CREATE FUNCTION queue_set_srcid RETURNS INT SONAME 'libqueue_engine.so'},
    ) {
        $dbh->do($cmd)
            or plan skip_all => 'q4m not found';
    }
}

plan tests => XXX;
...

これをモジュール化すべきかどうかは、微妙かなぁ。