From e6cd85e33f2113fc521ab26e93ea8005415edc2f Mon Sep 17 00:00:00 2001
From: Bryan Varner <1652015+bvarner@users.noreply.github.com>
Date: Thu, 3 Jun 2021 12:41:09 -0400
Subject: [PATCH] Adds argLine to instrument Integration Tests, TestConfig for
property documentation, and testing documentation on how to configure.
* Fix #7536 by adding the ability to specify an argLine property when running tests.
For Example, in a project I'm building:
```
maven-failsafe-plugin
${surefire-plugin.version}
integration-test
verify
org.jboss.logmanager.LogManager
${maven.home}
it
${argLine}
```
---
.../deployment/dev/testing/TestConfig.java | 6 ++
.../main/asciidoc/tests-with-coverage.adoc | 82 +++++++++++++++++++
.../io/quarkus/test/common/JarLauncher.java | 8 +-
3 files changed, 95 insertions(+), 1 deletion(-)
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