Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Setting up database connection in tests

by MidLifeXis (Prior)
on Sep 13, 2012 at 14:23 UTC ( #993502=note: print w/ replies, xml ) Need Help??


in reply to Setting up database connection in tests

  • What is the best way to let an installing person define the dsn and credentials for a database to connect to for testing? - I am not sure about 'best', but I have used an environment variable, and have a skip_all call if the variable is not set or cannot be used for some other reason. The test uses the credentials when setting up the thing under test when DB credentials are absolutely necessary. If, however, the DB stuff can be mocked out, I do that.
  • What is the best way to encapsulate the functionality of reading this information and connecting to that database for providing a dbh to test routines? I want to use this functionality in several test files. Unless this is a test that is specifically addressing the database side of things, I would recommend mocking as much of the DB stuff away as possible. I have been doing a bit of this lately as I touch code written when I was "less experienced" (What frobnitz wrote this?). It seems to me that any time you pull data from the database, you should instead abstract that out to a function call that returns data, and possibly out to its own module. The function can then be mocked in testing, and you only need to test the DB function for what it is explicitly supposed to do. This is a generalization, and should be taken with the right amount of skepticism :-).
  • Is there a way to connect only once to a database for all tests in the t-directory of a distribution? A kind of test suite global. No(*). Each .t script is run in its own process.

* - I suppose something could be attempted on some operating systems of opening the DB handle in a wrapper process, setting it up to be passed through some IPC method, and launching your test script once that setup is complete. It seems to me that this would be very fragile and too clever to maintain.

--MidLifeXis


Comment on Re: Setting up database connection in tests
Download Code
Re^2: Setting up database connection in tests
by Tanktalus (Canon) on Sep 20, 2012 at 02:55 UTC
    I suppose something could be attempted on some operating systems of opening the DB handle in a wrapper process, setting it up to be passed through some IPC method, and launching your test script once that setup is complete. It seems to me that this would be very fragile and too clever to maintain.

    Actually, that pretty much sums up DBD::Proxy. Not fragile at all, but precisely a piece of the core DBI package. And, for extra example code, see Coro::DBI (which cannot install via cpan only because the only release is a "developer" release though it has worked fine for me with the CB stats).

      Is DBD::Proxy setting up a single connection and then passing it to each test script, as asked by the OP (thinking along the lines of passing a file handle between various scripts), or is it setting up a meta-connection, where a connection to a DBI::Proxy connection is talking to another DBI connection through, well, a proxy?

      This approach is different than what I was considering, and does make some good sense. An approach that I had not considered!

      Update: Reading through the documentation for DBI::Proxy, I am not certain that it meets the needs of the OP's third requirement - connecting once to the database and being able to run all of the test scripts. Perhaps it is just my unfamiliarity with the Coro method of doing things. Would you have a more complete example that implements something along what the OP was asking?

      --MidLifeXis

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://993502]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2014-09-24 05:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (246 votes), past polls