NAME

Test::WithDB - Framework for testing application using database

VERSION

This document describes version 0.100 of Test::WithDB (from Perl distribution Test-WithDB), released on 2018-05-10.

SYNOPSIS

In your ~/test-withdb.ini:

admin_dsn ="dbi:Pg;host=localhost"
admin_user="postgres"
admin_pass="adminpass"

user_dsn ="dbi:Pg;host=localhost"
user_user="someuser"
user_pass="somepass"

# optional: SQL statements to initialize DB by test user after created
init_sql_admin=CREATE EXTENSION citext

# optional: SQL statements to initialize DB by test user after created
init_sql_user=

Or, if you want to put multiple configuration in your config file you can use config profiles:

[profile=pg]
admin_dsn ="dbi:Pg;host=localhost"
admin_user="postgres"
admin_pass="adminpass"

user_dsn ="dbi:Pg;host=localhost"
user_user="someuser"
user_pass="somepass"

[profile=mysql]
admin_dsn ="dbi:mysql"
admin_user="root"
admin_pass="adminpass"

user_dsn ="dbi:mysql"
user_user="someuser"
user_pass="somepass"

...

In your test file:

use Test::More;
use Test::WithDB;

my $twdb = Test::WithDB->new(
    #driver => '...',         # optional. preferred DBI driver, e.g. Pg, or mysql.
    #config_path => '...',    # optional. defaults to TWDB_CONFIG_PATH env or ~/test-withdb.ini or ~/twdb.ini
    #config_profile => '...', # optional. defaults to TWDB_CONFIG_PROFILE_<DRIVER> env (if driver is specified), or TWDB_CONFIG_PROFILE, or undef
    #name_pattern => '...',   # optional. defaults to TWDB_NAME_PATTERN env or 'testdb_%u'
);

my $dbh = $twdb->create_db; # create db with random name

# do stuffs with dbh

my $dbh2 = $twdb->create_db; # create another db

# do more stuffs

$twdb->done; # will drop all created databases, unless tests are not passing

DESCRIPTION

This class (Test::WithDB, or TWDB for short) provides a simple framework for testing application that requires database. It is meant to work with Test::More (or to be more exact, any Test::Builder-based module). It offers an easy way to create random databases and initialize them so they are ready for testing. More functionalities will be added in the future.

To work with TWDB, first, you supply a configuration file containing admin and normal user's connection information (the admin info is needed to create databases). Then, you call one or more create_db() to create one or more databases for testing. The database will be created with random names.

At the end of testing, when you call $twdb->done, the class will do this check:

if (Test::More->builder->is_passing) {
    # drop all created databases
} else {
   diag "Tests failing, not removing databases created during testing: ...";
}

So when testing fails, you can inspect the database.

Currently only supports Postgres, MySQL, and SQLite; and tested mostly with Postgres.

CONFIGURATION

*admin_dsn => str

*admin_user => str

*admin_pass => str

*user_dsn => str

*user_user => str

*user_pass => str

init_sql_admin => str|array

init_sql_user => str|array

sqlite_db_dir => str (default: .)

ATTRIBUTES

driver => str

Preferred DBI driver. If set, this will make Test::WithDB consult TWDB_CONFIG_PROFILE_DRIVER environment variable before TWDB_CONFIG_PROFILE to set default value for config_profile. For example, if you set driver to mysql, then TWDB_CONFIG_PROFILE_MYSQL will be consulted first before TWDB_CONFIG_PROFILE.

config_path => str (default: ~/test-withdb.ini or ~/twdb.ini).

Path to configuration file. File will be read using Config::IOD::Reader.

config_profile => str (default: GLOBAL)

Pick section in configuration file to use.

name_pattern => str (default: testdb_%Y%m%d_%H%M%S_%u)

Pattern for random database name, where several sprintf-/strftime-style %X directives are recognized:

  • %%

    Literal percentage sign

  • %U

    32-character random UUID hex. It is recommended that at least you add either this or %u.

  • %u

    8-character prefix of random UUID hex. It is recommended that at least you add either this or %u. If you use %u instead of %U, it is recommended that you also add timestamp.

  • %Y

    4-digit year of current time.

  • %m

    2-digit month (01-12) of current time.

  • %d

    2-digit day of month (01-31) of current time.

  • %H

    2-digit hour (00-23) of current time.

  • %M

    2-digit minute (00-59) of current time.

  • %S

    2-digit second (00-60) of current time.

You should make sure that the database name won't exceed the maximum length allowed by the database software (e.g. 64 character for some SQL databases).

METHODS

new(%attrs) => obj

$twdb->create_db

Create a test database with random name according to name_pattern.

$twdb->created_dbs => LIST

Return a list of temporary databases already created by this instance.

$twdb->done

Finish testing. Will drop all created databases unless tests are not passing or TWDB_KEEP_TEMP_DBS is set to true.

Called automatically during DESTROY (but because object destruction order are not guaranteed, e.g. DBI database handle might get destroyed first preventing proper database deletion to work, it's best that you explicitly call done() yourself).

$twdb->drop_dbs

Explicitly delete created temporary databases, regardless of whether tests are passing or TWDB_KEEP_TEMP_DBS is set.

ENVIRONMENT

TWDB_CONFIG_PATH => str

Set default config_path.

TWDB_CONFIG_PROFILE => str

Set default config_profile.

TWDB_NAME_PATTERN => str

Set default name_pattern.

TWDB_KEEP_TEMP_DBS => bool

Can be set to true to keep done() from automatically dropping databases.

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/Test-WithDB.

SOURCE

Source repository is at https://github.com/perlancar/perl-Test-WithDB.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=Test-WithDB

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

SEE ALSO

DBIx::TempDB

Test::More, Test::Builder

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.