public class Hello { public String greetings(String name) { return name != null ? "hello, " + name : "hi, what's your name?"; } }
Entries tagged [unit]
Excluding particular JUnit test cases that marked as slow in the time of execution
TweetPosted on Sunday Nov 01, 2015 at 03:43PM in Technology
Sometimes we need to create some slow test cases that involve some external resources such as databases, or external API servers. They are necessary to ensure that your application can integrate with such external resources while vast majority of test cases should stick with fast-running plain unit testing.
In such case, We usually wants to exclude such slow test cases from the ones that are frequently executed in local development environment so that we can get timely response from the tests. In this posting, I introduce you a solution that avoids maintenance of any hand-made listing of test cases.
Creating a suite that scans and runs all of test cases exist in classpath
First, assume we have a simple production class named Hello
.
We also have a couple of test cases against the preceding class:
public class HelloTest1 { @Test public void test() { System.out.println("Running " + getClass().getSimpleName()); Assert.assertEquals("hello, kyle", new Hello().greetings("kyle")); } } public class HelloTest2 { @Test public void test() { System.out.println("Running " + getClass().getSimpleName()); Assert.assertEquals("hi, what's your name?", new Hello().greetings(null)); } }
Next, We’d like to introduce a test suite that automatically includes the preceding two test cases. Put a following dependency to your pom.xml
:
<dependency> <groupId>io.takari.junit</groupId> <artifactId>takari-cpsuite</artifactId> <version>1.2.7</version> <scope>test</scope> </dependency>
And create a test suite that named AllTests
as follows. You can run this suite from your IDE or executing mvn -Dtest=AllTests test
.
@RunWith(ClasspathSuite.class) public class AllTests { }
Involving a slow test case and exclude it
First, Create a marker interface which indicates that this test is slow:
public interface SlowTest { }
Next create a slow test case which annotated with @Category(SlowTest.class)
that we would like to avoid execute it frequently:
@Category(SlowTest.class) public class HelloSlowTest { @Test public void test() throws Exception { System.out.println("Running " + getClass().getSimpleName()); Thread.sleep(3000); } }
Finally create a test suite that automatically excludes the test cases annotated as slow but executes rest of the test cases:
@RunWith(Categories.class) @ExcludeCategory(SlowTest.class) @SuiteClasses(AllTests.class) public class AllExceptSlowTests { }
You can run it on a daily basis instead of selecting root of your entire project and execute tests from your IDE or Maven without any hand maintenance of the listings of tests. For example, mvn -Dtest=AllExceptSlowTests test
produces following output in very short-term execution time:
... ------------------------------------------------------- T E S T S ------------------------------------------------------- Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 Running category.suite.AllExceptSlowTests Running HelloTest1 Running HelloTest2 Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.084 sec ...
The complete resources can be obtained from https://github.com/lbtc-xxx/junit-category