Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enable a global timeout for JUnit testcase runs?

This question suggests to use the timeout parameter of the @Test annotation to have JUnit forcefully stop tests after that timeout period.

But we have like 5000 unit tests so far, and we want to establish a policy that asks developers to never release tests that need more than 10 seconds to complete. The policy would probably say "aim for < 10 seconds", but then we would like to ensure that any test is stopped after say 30 seconds. (the numbers are just examples, the idea is to define something that is "good enough" for most use cases, but that also makes sure things dont run "forever" )

Now I am wondering if there is a way to enable such behavior without turning into each test case and adding that annotation parameter.

The existing question doesn't help either: I am looking for one change to enable this, not a one change per test class solution. One central, global switch. Not one per file or method.

like image 502
GhostCat Avatar asked May 08 '18 08:05

GhostCat


1 Answers

Although JUnit Jupiter (i.e., the programming and extension model introduced in JUnit 5) does not yet have built-in support for global timeouts, you can still implement global timeout support on your own.

The only catch is that a timeout extension cannot currently abort test execution preemptively. In other words, a timeout extension in JUnit Jupiter can currently only time the execution of tests and then throw an exception if the execution took too long (i.e., after waiting for the test to end, which may potentially never happen if the test hangs).

In any case, if you want to implement a non-preemptive global timeout extension for use with JUnit Jupiter, here's what you need to do.

  1. Look at the TimingExtension example in the JUnit 5 User Guide for inspiration. You'll need code similar to that, but you'll want to throw an exception if the duration exceeds a configured timeout. How you configure your global timeout is up to you: hard code it, look up the value from a JVM system property, look up the value from a custom annotation etc.
  2. Register your global timeout extension using Java's ServiceLoader mechanism. See Automatic Extension Registration for details.

Happy Testing!

like image 151
Sam Brannen Avatar answered Oct 07 '22 12:10

Sam Brannen