Search code examples
javamavenautomated-teststest-framework

Where on a Maven build should a test framework reside - src/test/java or src/main/java?


I understand from the previous answers on this site that, for Maven builds:

  1. src/main/java will be deployed to production whereas src/test/java will not be.
  2. src/main/java contains the main application whereas src/test/java will contain code to test the main app

Now my question is, when writing a test framework, which approach is better/worse:

  1. Test framework itself will be the main app - hence it will reside on src/main/java?
  2. Test framework will only be used to test the main app - hence will reside on src/main/java?

Somehow getting stuck on visualizing this properly -

  • Approach 1 seems to be correct as a test framework will be the main purpose of the build hence that will be the main app.

    But then somehow I cannot imagine a test framework being deployed to production.

  • Approach 2 seems to be correct, but then if the main purpose is to write a test framework then what will go inside src/main/java? Will that be empty or non-existing for my test framework app?

Any suggestions on this would be helpful.


Solution

  • I think you're going astray with

    1. src/main/java will be deployed to production whereas src/test/java will not be.

    I would rephrase it as

    1. src/main/java contains the code that consumers of the module will use (it is the purpose of your module)
    • If your module is about something that an end user works with it will go into production.
    • If your module is a testing framework then it will not go into production (in the sense of being deployed onto a server or on client machines), but other modules will use it, so the testing framework should be in src/main/java

    (This assumes that you build the testing framework as a separate module)

    If you need real life examples, you don't need to look any further than JUnit (the legendary testing framework)

    • src/main/java contains the JUnit testing framework
    • src/test/java contains code to test the testing framework

    Prefer to work with TestNG? The code for TestNG is in a submodule "core", but even then:

    • core/src/main/java contains the TestNG testing framework
    • core/src/test/java contains code to test the testing framework