NAME

Test::DB::Shared::mysqld - Replaces (and decorate) Test::mysqld to share the MySQL instance between your tests

SYNOPSIS

If in your test you use Test::mysqld, this acts as a replacement for Test::mysqld:

my $mysqld = Test::DB::Shared::mysqld->new(
    test_namespace => 'myapp',
    # Then it's plain Test::mysqld config
    my_cnf => {
      'skip-networking' => '', # no TCP socket
   }
);

# and use like Test::mysqld:
my $dbh = DBI->connect(
    $mysqld->dsn(), undef, ''
);

And that's it. No special code to write, no restructuring of your tests, and using as a prove plugin is optional.

STATEMENT

What you need is a test database, not a test mysqld instance.

HOW TO USE IT

See synopsis for the change to your test code. For the rest, you need to use prove -j number to benefit from it.

If not all your test use the test db, best results will be obtained by using prove -s -j number

Using it as a prove Plugin

To speed things even further, you can use that as a prove plugin, with an optional config file:

prove -PTest::DB::Shared::mysqld

Or

prove -PTest::DB::Shared::mysqld=./testmysqld.json

The ./testmysqld.json file can contain the arguments to Test::DB::Shared::mysqld in a json format (see SYNOPSIS). They will be used to build one instance for the whole test suite.

If no such file is given, the default configuration is the one specified in the SYNOPSIS, but with a randomly generated test_namespace.

Note that using this plugin will result in all your Test::DB::Shared::mysqld instances in your t/ files using the same configuration, regardless of what configuration you give in this or this test.

LIMITATIONS

Do NOT use that if your test involves doing anything outside a test database. Tests that manage databases will probably break this.

Not all mysqld methods are available. Calls like 'start', 'stop', 'setup', 'read_log' .. are not implemented.

WHAT THIS DOES

The first time this is used, it will create a Test::mysqld instance in the current process. Then concurrent processes that use the same module (with the same parameters) will be given a new Database in this already running instance, instead of a new MySQL instance.

When this goes out of scope, the test database is destroy, and the last process to destroy the last database will tear down the MySQL instance.

BUGS, DIAGNOSTICS and TROUBLESHOOTING

There are probably some. To diagnose them, you can run your test in verbose mode ( prove -v ). If that doesn't help, you can 'use Log::Any::Adapter qw/Stderr/' at the top of your test to get some very verbose tracing.

If you SIGKILL your whole test suite, bad things will happen. Running in verbose mode will most probably tell you which files you should clean up on your filesystem to get back to a working state.

METHODS

load

App::Prove plugin implementation. Do NOT use that yourself.

dsn

Returns the dsn to connect to the test database. Note that the user is root and the password is the empty string.

pid

See Test::mysqld