diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestConfig.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestConfig.java index a485a5ab65fcb..0f9627189d39c 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestConfig.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestConfig.java @@ -133,6 +133,12 @@ public class TestConfig { @ConfigItem Profile profile; + /** + * JVM parameters that are used to launch jar based integration tests. + */ + @ConfigItem + Optional integrationJvmArgLine; + /** * Configures the hang detection in @QuarkusTest. If no activity happens (i.e. no test callbacks are called) over * this period then QuarkusTest will dump all threads stack traces, to help diagnose a potential hang. diff --git a/docs/src/main/asciidoc/tests-with-coverage.adoc b/docs/src/main/asciidoc/tests-with-coverage.adoc index 9db25b1d84f2e..3a1ebddba1107 100644 --- a/docs/src/main/asciidoc/tests-with-coverage.adoc +++ b/docs/src/main/asciidoc/tests-with-coverage.adoc @@ -1,3 +1,4 @@ + //// This guide is maintained in the main Quarkus repository and pull requests should be submitted there: @@ -234,6 +235,87 @@ In addition to including the `quarkus-jacoco` extension in your pom you will nee WARNING: This config will only work if at least one `@QuarkusTest` is being run. If you are not using `@QuarkusTest` then you can simply use the Jacoco plugin in the standard manner with no additional config. +=== Coverage for Integration Tests + +To get code coverage data from integration tests, Jacoco needs to be configured, and your `@QuarkusIntegrationTest` classes must be run using a jar package, + +In the `pom.xml`, you can add the following plugin configuration for Jacoco. This will append integration test data into the same destination file as unit tests, +re-build the jacoco report after the integration tests are complete, and thus produce a comprehensive code-coverage report. +[source, xml] +---- + + ... + + ... + + org.jacoco + jacoco-maven-plugin + + + default-prepare-agent-integration + + prepare-agent-integration + + + ${project.build.directory}/jacoco-quarkus.exec + true + *QuarkusClassLoader + + + + report-it + post-integration-test + + report + + + ${project.build.directory}/jacoco-quarkus.exec + ${project.build.directory}/jacoco-report + + + + + ... + + ... + +---- + +In order to run the integration tests as a jar with the Jacoco agent, add the following to your `pom.xml`. +[source, xml] +---- + + ... + + ... + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + org.jboss.logmanager.LogManager + ${maven.home} + ${argLine} + + + + + + + ... + + ... + + +---- == Conclusion diff --git a/test-framework/common/src/main/java/io/quarkus/test/common/JarLauncher.java b/test-framework/common/src/main/java/io/quarkus/test/common/JarLauncher.java index 28ab29b542d47..2e606355c2a8a 100644 --- a/test-framework/common/src/main/java/io/quarkus/test/common/JarLauncher.java +++ b/test-framework/common/src/main/java/io/quarkus/test/common/JarLauncher.java @@ -26,6 +26,7 @@ public class JarLauncher implements ArtifactLauncher { private final Path jarPath; private final String profile; + private final String argLine; private Process quarkusProcess; private final int httpPort; private final int httpsPort; @@ -39,6 +40,7 @@ private JarLauncher(Path jarPath, Config config) { config.getValue("quarkus.http.test-port", OptionalInt.class).orElse(DEFAULT_PORT), config.getValue("quarkus.http.test-ssl-port", OptionalInt.class).orElse(DEFAULT_HTTPS_PORT), config.getValue("quarkus.test.jar-wait-time", OptionalLong.class).orElse(DEFAULT_JAR_WAIT_TIME), + config.getOptionalValue("quarkus.test.argLine", String.class).orElse(null), config.getOptionalValue("quarkus.test.native-image-profile", String.class) .orElse(null)); } @@ -47,11 +49,12 @@ public JarLauncher(Path jarPath) { this(jarPath, installAndGetSomeConfig()); } - public JarLauncher(Path jarPath, int httpPort, int httpsPort, long jarWaitTime, String profile) { + public JarLauncher(Path jarPath, int httpPort, int httpsPort, long jarWaitTime, String argLine, String profile) { this.jarPath = jarPath; this.httpPort = httpPort; this.httpsPort = httpsPort; this.jarWaitTime = jarWaitTime; + this.argLine = argLine; this.profile = profile; } @@ -61,6 +64,9 @@ public void start() throws IOException { List args = new ArrayList<>(); args.add("java"); + if (argLine != null) { + args.add(argLine); + } args.add("-Dquarkus.http.port=" + httpPort); args.add("-Dquarkus.http.ssl-port=" + httpsPort); // this won't be correct when using the random port but it's really only used by us for the rest client tests