JUnit Test Suite Example
1. Introduction
A JUnit Test suite is used to bundle multiple test cases together in a single run. This is usually used if you want to integrated several JUnit Test cases that makes up a specific functionality from the integration. The developer uses the @RunWith
and @SuiteClasses
to run Suite tests for this purposes.
In this example, I’ll be showing a simple approach on how you’ll create a Test Suite that will call 3 test cases.
2. Sources
We first prepare our test cases. In this example, we created 3 different test case classes.
JUnitTest1Suite1.java
package com.areyes1.jgc.test.suite; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; public class JUnitTest1Suite1 { int totalNumberOfApplicants = 0; int totalNumberOfAcceptableApplicants = 10; @Before public void setData(){ this.totalNumberOfApplicants = 9; } @Test public void testAssertions() { assertTrue((this.totalNumberOfApplicants != this.totalNumberOfAcceptableApplicants)); } @Test public void testAssertFalse() { assertTrue((this.totalNumberOfApplicants == this.totalNumberOfAcceptableApplicants)); } @Test public void testAssertTrueWithMessage(){ assertTrue("Is total number of applicants acceptable?",(this.totalNumberOfApplicants != this.totalNumberOfAcceptableApplicants)); } }
JUnitTest2Suite1.java
package com.areyes1.jgc.test.suite; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.isA; import static org.junit.Assert.assertThat; import java.util.ArrayList; import org.junit.Before; import org.junit.Test; public class JUnitTest2Suite1 { int totalNumberOfApplicants = 0; int totalNumberOfAcceptableApplicants = 10; ArrayList listOfValidStrings = new ArrayList(); @Before public void setData(){ this.totalNumberOfApplicants = 9; listOfValidStrings.add("object_1"); listOfValidStrings.add("object_2"); listOfValidStrings.add("object_3"); } @Test public void testAssertThatEqual() { assertThat("123",is("123")); } @Test public void testAssertThatNotEqual() { assertThat(totalNumberOfApplicants,is(123)); } @Test public void testAssertThatObject() { assertThat("123",isA(String.class)); } @Test public void testAssertThatWMessage(){ assertThat("They are not equal!","123",is("1234")); } }
JUnitTest3Suite1.java
package com.areyes1.jgc.test.suite; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.jgc.areyes1.junit.AccountService; import com.jgc.areyes1.junit.obj.Account; public class JUnitTest3Suite1 { private AccountService accountService = new AccountService(); private Account dummyAccount; @Before // setup() public void before() throws Exception { System.out.println("Setting it up!"); dummyAccount = accountService.getAccountDetails(); } @Test public void testDummyAccount() { System.out.println("Running: testDummyAccount"); assertNotNull(dummyAccount.getAccountCode()); } @Test public void testDummyAccountTransactions() { System.out.println("Running: testDummyAccountTransactions"); assertEquals(dummyAccount.getAccountTransactions().size(),3); } @After // tearDown() public void after() throws Exception { System.out.println("Running: tearDown"); dummyAccount = null; assertNull(dummyAccount); } }
After creating or identifying our JUnit test cases that we want to include on this suite, we then create our JUnit Test case suite that will call the 3 tests case classes. Take note of the usage of @RunWith
and@SuiteClasses
as per below.
JUnitSuite1.java
package com.areyes1.jgc.test.suite; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ JUnitTest1Suite1.class, JUnitTest2Suite1.class, JUnitTest3Suite1.class }) public class JUnitSuite1 { }
The @RunWith
annotation is used to tag a class that it should run with a specific class. In this example, we are running this class with a Suite.class to tell our runner that we required that class for this run. The @SuiteClasses
is the annotation that is used to specify the JUnit Test cases that this suite will be composed of. As specified, we called the 3 unit test case class we created.
These are all test cases that we want to run in this suite. As we can see, we have different test case scenarios for each. The purpose of us creating a test suite for them is so that we can consolidate their execution and results into one.
3. Running the JUnit Test Suite
You can run the test case by:
- Eclipse JUnit Test case run
- Create a Runner class from your main entry point
3.1 Eclipse JUnit Test case run
The eclipse way is straight forward, we right click on the JUnitSuite1.java
> Run As > JUnit Test.
3.2 Create a Runner class from your main entry point
We can also run the test case using a Runner class. Code of the runner below
TestRunnerForTestSuite.java
package com.areyes1.jgc.test.suite.runner; import org.junit.runner.JUnitCore; import org.junit.runner.notification.Failure; import com.areyes1.jgc.test.suite.JUnitSuite1; public class TestRunnerForTestSuite { public static void main(String[] args) { org.junit.runner.Result result = JUnitCore.runClasses(JUnitSuite1.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Result of running the runner below
As you might have observe, the test suite runs all the test case class that’s associated to it. It’s grouping all of these test case to come up with a unified results of specific scenarios of the system. This is extremely a valuable feature especially if we need to test different scenarios of integrated services for a common functional requirement. A great example would be if there is a separate module/service for account opening and account cash transfer. With this feature, we can combine the test cases of these two functional requirements and come up with a unified test case of an end to end account opening to cash transfer process.
4. Download the Eclipse project
This was an example of JUnit Test Suite.
You can download the full source code of this example here: junit-testsuite-example