Hi,

The DBD::mysql driver has some tests that are run against a test
database. By default it tries to connect to a database called 'test',
on localhost port 3306 or using local socket connection depending on
your OS, with the current user and without a password.If the database
'test' is not available, it tries to create one. Then it creates some
tables in the database and removes them after the tests are complete.

Obviously, this fails often. Many times you'd only have libmysqlclient
on your machine if you'd compile DBD::mysql. In 'olden times' you
could only compile against the server headers but this is no longer
the case. And *if* you happen to have a server running locally,
chances are slim the access with the 'default' credentials will
actually work. Because tests do not share global state, every of the
60+ test files tries to set up a database connection on its own, and
then maybe fail. Especially if you don't have a local server running,
this can take some time, because each test tries to connect, and then
times out.

In this section of DBD::DBD -
https://metacpan.org/pod/DBI::DBD#Files-common-to-pure-Perl-and-C-XS-drivers
there is some talk about how drivers should not let database objects
behind and how you should be explicit about what your tests will do.

For DBD::mysql you can specify the database server to test against via
command line switches to Makefile.PL and also via environment
variables.

https://metacpan.org/pod/distribution/DBD-mysql/lib/DBD/mysql/INSTALL.pod#Environment-Variables
https://metacpan.org/pod/distribution/DBD-mysql/lib/DBD/mysql/INSTALL.pod#Configuration

My suggestion would be the following:

1. Only perform tests against a database if one or more switches of
Makefile.PL or environments are set

2. If a database connection can not be successfully created, bail out
with a more or less useful error message

This might mean that where 'database' tests previously tests would be
run, they now don't - but as I tried to explain above I think chances
for successful tests without any configuration are pretty slim
anyways. On the other hand, I think it means that the overall
experience of installing the module might improve, because if there
would be no testing against databases at all we can more easily and
more quickly skip those tests.

Also, if you really want to run tests against a database, it actually
can help you if testing bails out because it fails quickly instead of
running all 60+ test files and having each one trying to set up a
database connection.

As far as I have seen this is more or less similar to how DBD::ODBC does things.

Please let me know if this sounds reasonable or if there would be any
conceivable problems.

--
Michiel

Reply via email to