Best practices for integration tests with Maven?

matt b picture matt b · Aug 4, 2009 · Viewed 31.3k times · Source

I have a project which I am building with Maven which uses Hibernate (and Spring) to retrieve data from a database, etc.

My "tests" for the DAOs in my project extend Spring's AbstractTransactionalDataSourceSpringContextTests so that a DataSource can be wired into my class under test to be able to actually run the query/Hibernate logic, to fetch data, etc.

On several other projects I've used these types of test in concert with a HSQL database (either in-memory or pointed at a file) to be able to efficiently test the actual database querying logic without relying on an external database. This works great, since it avoids any external dependencies and the "state" of the database prior to running the tests (each of which are wrapped in a transaction which is rolled back) is well defined.

I'm curious though about the best way to organize these tests, which are really a loose flavor of integration tests, with Maven. It feels a bit dirty to keep these tests in src/test/java, but from what I've read there doesn't seem to be a consistent strategy or practice for organizing integration tests with Maven.

From what I've read so far, seems like I can use the Failsafe plugin (or a second instance of Surefire) and bind it to the integration-test phase, and that I can also bind custom start-up or shutdown logic (such as for starting/stopping the HSQL instance) to pre-integration-test or post-integration-test. But, is this really the best method?

So my question basically is - what is the generally accepted best practice on organizing this with Maven? I'm having trouble finding any sort of consistent answer in the documentation.

What I'd like is to:

  • Seperate unit tests from integration tests, so only unit tests are run during the test phase
  • The ability to bind custom startup/shutdown logic to pre-integration-test and post-integration-test
  • Have the reports from the integration-tests merged/presented with the unit test Surefire reports

Answer

John Dobie picture John Dobie · Jul 4, 2011

A very simple way of doing this is to use JUnit categories.

You can then easily run some tests during the test phase and another during the integration-test phase.

It takes minutes and requires only 3 steps.

  1. Define a marker interface
  2. Annotate the classes you wish to split
  3. Configure Maven plugins.

A full example is given here. https://stackoverflow.com/a/10381662/1365383