Run JUnit Tests contained in dependency jar using Maven Surefire
Asked Answered
B

3

31

I have a jar in my maven repository that contains junit tests, which should be run in different projects, because it is able to inspect the project and test for certain features of it. Unforunately surefire doesn't pick up tests that are contained in a jar, as this Feature Request shows.

In the feature request they propose to unpack the jar to be then executed by surefire.

I successfully unpacked the jar using the maven-dependency-plugin, but the contained tests are not executed anyway. This is how I configured the maven-dependency-plugin to unpack my jar:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>de.mwx.test</groupId>
                        <artifactId>selenium-test-base</artifactId>
                        <version>0.1</version>
                        <overWrite>true</overWrite>
                          <outputDirectory>
                              ${project.build.directory}/classes
                          </outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

Any help would be appriciated.

Brim answered 8/5, 2012 at 10:28 Comment(6)
Why are the tests in another jar? Are they tests for your project, or another? If another, why are you running them? If for your app, why aren't they in your project?Cray
The other jar is actually a test framework that operates on the current project and executes miscellaneous tasks. It seemed to me like the most modular way: But it wasn't the intended use for surefix, I guess.Brim
But maven projects already define a standard for a project's tests. And IMO it doesn't make sense to make a project dependent on its tests--if anything, tests would be dependent on the module under test, since tests use the module, but not vice-versa.Cray
It does make sense to make a project to be dependent of its tests if the project itself is a test. the depending jar is a framework that calls the tests in the current project. This makes it easy to configure a fleet of tests on the fly.Brim
IMO, no, that doesn't make sense.Cray
If this worked, you could use this kind approach to add a dependency for Consumer driven contracts : martinfowler.com/articles/consumerDrivenContracts.htmlPerfervid
C
49

There is a way of running a test in maven from another jar. from maven-surefire-plugin version 2.15 you can tell maven to scan your test jars for tests and run them. You don't need to extract the tests jar. Just add a dependency to your test jar and:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <dependenciesToScan>
                <dependency>test.jar.group:test.jar.artifact.id</dependency>
            </dependenciesToScan>
        </configuration>
    </plugin>

Took this stuff from https://gist.github.com/aslakknutsen/4520226 And https://issues.apache.org/jira/browse/SUREFIRE-569

As expected, this works for JUnit and Testng. Will probably work for anything that surefire can run.

Crescentia answered 12/6, 2013 at 9:12 Comment(2)
Worked like a charm! Even when specifying a dependency on the test-jar (with <classifier>tests</classifier>)Lakin
@Lakin did you have to do anything to specify the tests classifier?Dimitri
I
3

(This is just restating what is in a comment above from khmarbaise, but since it wasn't clarified, I think it's worth restating):

Use the test-classes directory instead of the classes folder as outputDirectory:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>de.mwx.test</groupId>
                        <artifactId>selenium-test-base</artifactId>
                        <version>0.1</version>
                        <overWrite>true</overWrite>
                          <outputDirectory>
                              ${project.build.directory}/test-classes
                          </outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
Iseult answered 28/1, 2013 at 21:48 Comment(0)
B
1

As described in the issue you need to have a Suite which is contains in your project which is NOT located in the test jar.

Bauske answered 8/5, 2012 at 10:46 Comment(2)
Yes, thats what the project I'm talking about is. I will update my question to make that point more clear.Brim
I would suggest to use the test-classes directory instead of the classes folder as outputDirectory.Bauske

© 2022 - 2024 — McMap. All rights reserved.