Running JUnit tests with Gradle is as simple as executing the gradle test command into the project’s root directory. Gradle has built-in support for running JUnit tests, and we can customize the behavior according to the project’s requirements.
# Run all tests
gradle test
# Clean the test results, then run all tests
gradle cleanTest test
# Clean the test results, run all tests, and show detailed output
gradle cleanTest test -i
# Run a specific test method in a specific test class
gradle test --tests com.howtodoinjava.junit5.examples.AppTest.testCalAdd
# Run all test methods in a specific test class
gradle test --tests com.howtodoinjava.junit5.examples.AppTest
# Run all test methods in all test classes within a package
gradle test --tests com.howtodoinjava.junit5.examples.*
# Run all test methods in test classes whose names start with "Test"
gradle test --tests com.howtodoinjava.junit5.examples.Test*
# Run a specific test method in all test classes within a package
gradle test --tests com.howtodoinjava.junit5.examples.*.testCalSubtract
# Run multiple test classes/methods in separate invocations
gradle test --tests com.howtodoinjava.junit5.examples.AppTest --tests /
com.howtodoinjava.junit5.examples.ordering.CustomOrderTests
See Also: Running Tests with Maven
1. Setting Up JUnit Plugin for Gradle
In the project’s build.gradle
file, add the latest version of JUnit dependency to the test implementation dependencies. For JUnit 5, you’ll also need the JUnit Platform dependencies.
test {
useJUnitPlatform()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0'
}
For JUnit 4, the dependencies would look slightly different:
dependencies {
testImplementation 'junit:junit:4.13'
}
2. Executing Unit Tests with Gradle
To execute all tests run the 'gradle test'
command.
gradle test
It is important to note that the ‘gradle test‘ command executes the tests only one time per change. So if you are running it the second time there will be no output on test results until you modify the tests. Gradle says UP-TO-DATE on unmodified tests.
If you want to force the test cases to run, use ‘gradle cleanTest test‘.
gradle cleanTest test
3. Customizing Logging Output
Also, if you want to run tests with more verbose logging, you can switch on the INFO logs by adding ‘-i‘ flag to the command.
gradle cleanTest test -i
If you want to capture the test results more concisely, you add a Groovy closure that does the logging for you:
test {
useJUnitPlatform()
afterTest { desc, result ->
logger.quiet "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
}
}
Notice the test output now:
Executing test testTwo() [com.howtodoinjava.junit5.examples.xmlReport.HelloTest] with result: SUCCESS
Executing test testOnProd() [com.howtodoinjava.junit5.examples.AssumptionsTest] with result: SUCCESS
Executing test testCaseA(TestInfo) [com.howtodoinjava.junit5.examples.ClassATest] with result: SUCCESS
Executing test testOnDev() [com.howtodoinjava.junit5.examples.AssumptionsTest] with result: SUCCESS
...
...
4. Filtering and Executing Tests with Gradle
Now let us see some examples to execute only specific tests filtered by test classes and methods. Note that the steps to run a test suite are the same as the test class.
4.1. Executing Only a Single Test
To run all tests only from a specific test class, use the –tests flag and pass the method name along with the class name as follows:
gradle test --tests com.howtodoinjava.junit5.examples.AppTest.testCalAdd
Program output:
> Task :test
Executing test testCalAdd() [com.howtodoinjava.junit5.examples.AppTest] with result: SUCCESS
4.2. Execute All Tests of a Test Class
To run all tests only from a specific test class, use the –tests flag as shown in the following command:
gradle test --tests com.howtodoinjava.junit5.examples.AppTest
Program output:
> Task :test
Executing test testCalcTwo() [com.howtodoinjava.junit5.examples.AppTest] with result: SKIPPED
Executing test testCalAdd() [com.howtodoinjava.junit5.examples.AppTest] with result: SUCCESS
Executing test testCalSubtract() [com.howtodoinjava.junit5.examples.AppTest] with result: SUCCESS
Executing test testCalMultiply() [com.howtodoinjava.junit5.examples.AppTest] with result: SUCCESS
4.3. Execute All Tests of Multiple Test Classes
Similar to the previous example, we can repeat all the test classes with ‘–tests‘ flag and gradle will run all tests.
gradle test --tests com.howtodoinjava.junit5.examples.AppTest --tests /
com.howtodoinjava.junit5.examples.ordering.CustomOrderTests
Program output:
> Task :test
Executing test testCalSubtract() [com.howtodoinjava.junit5.examples.AppTest] with result: SUCCESS
Executing test testCalMultiply() [com.howtodoinjava.junit5.examples.AppTest] with result: SUCCESS
...
Executing test testA() [com.howtodoinjava.junit5.examples.ordering.CustomOrderTests] with result: SUCCESS
...
...
4.4. Execute Tests from Multiple Classes and Packages using Regex
To run all tests that are present in several classes in a package, or scattered in several packages, we can use regular expressions to scan for those classes.
For example, the following command will execute all tests from package ‘com.howtodoinjava.junit5.examples‘.
gradle test --tests com.howtodoinjava.junit5.examples.*
Similarly, we can run all tests in the same package that starts with the name “Test” as follows:
gradle test --tests com.howtodoinjava.junit5.examples.Test*
We can execute all tests that match a method name using regex, no matter where the test is present inside the hierarchy.
gradle test --tests com.howtodoinjava.junit5.examples.*.testCalSubtract
5. Re-run the Failed Tests
To rerun failed tests with Gradle from the command line, we can use the --rerun-tasks
option. This option allows to rerun tasks that failed during the previous Gradle build, including test tasks.
We can specify how many times to rerun by adding a numeric value after the option. For example, to rerun failed tests only once:
gradle test --rerun-tasks 1
If you want to keep rerunning until all tests pass, you can use a high number or -1
to indicate an indefinite number of reruns.
gradle test --rerun-tasks -1
6. Conclusion
In this article, we’ve explored the essential steps for running JUnit tests with Gradle, demonstrating the simplicity and flexibility that Gradle offers for test automation.
By configuring test tasks, and utilizing the --tests
option, we can effortlessly run tests at various granularities, from entire test suites to specific test classes or methods.
Happy Learning !!
Comments