Bird
Raised Fist0
JUnittesting~5 mins

Timeout annotations in JUnit

Choose your learning style10 modes available
Introduction

Timeout annotations help stop tests that take too long. This keeps your testing fast and reliable.

When a test might hang or run forever by mistake.
To make sure slow tests fail quickly instead of waiting too long.
When testing code that should finish within a certain time limit.
To avoid blocking other tests in a large test suite.
When you want to detect performance problems early.
Syntax
JUnit
@Test
@Timeout(value = 5, unit = TimeUnit.SECONDS)
public void testMethod() {
    // test code here
}

The @Timeout annotation sets a time limit for the test method.

If the test runs longer than the limit, it fails automatically.

Examples
This test fails if it runs longer than 2 seconds.
JUnit
@Test
@Timeout(value = 2, unit = TimeUnit.SECONDS)
public void quickTest() {
    // test that must finish within 2 seconds
}
Timeout defaults to seconds if unit is not specified.
JUnit
@Test
@Timeout(1)
public void defaultUnitTest() {
    // test with 1 second timeout (default unit is seconds)
}
Timeout can be set in milliseconds for very fast tests.
JUnit
@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
public void fastTest() {
    // test must finish within 500 milliseconds
}
Sample Program

The first test sleeps 1 second and passes because it is under the 2-second timeout.

The second test sleeps 2 seconds but has a 1-second timeout, so it fails.

JUnit
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import java.util.concurrent.TimeUnit;

public class TimeoutExampleTest {

    @Test
    @Timeout(value = 2, unit = TimeUnit.SECONDS)
    public void testFastMethod() throws InterruptedException {
        Thread.sleep(1000); // sleeps 1 second, should pass
    }

    @Test
    @Timeout(value = 1, unit = TimeUnit.SECONDS)
    public void testSlowMethod() throws InterruptedException {
        Thread.sleep(2000); // sleeps 2 seconds, should fail
    }
}
OutputSuccess
Important Notes

@Timeout can be used on test methods as well as @BeforeEach, @AfterEach, @BeforeAll, and @AfterAll methods.

Use timeouts carefully to avoid false failures on slow machines.

You can also set timeouts globally for all tests in some JUnit configurations.

Summary

Timeout annotations stop tests that run too long.

They help keep tests fast and catch hanging code.

Set time limits using @Timeout with a value and time unit.

Practice

(1/5)
1. What is the main purpose of the @Timeout annotation in JUnit tests?
easy
A. To mark a test as expected to fail
B. To repeat a test multiple times automatically
C. To skip a test during execution
D. To stop a test if it runs longer than a specified time limit

Solution

  1. Step 1: Understand the role of @Timeout

    The @Timeout annotation sets a maximum time limit for a test method to run.
  2. Step 2: Identify what happens when time limit is exceeded

    If the test runs longer than the specified time, it is stopped and marked as failed.
  3. Final Answer:

    To stop a test if it runs longer than a specified time limit -> Option D
  4. Quick Check:

    @Timeout stops long tests = A [OK]
Hint: Timeout means stop test if too slow [OK]
Common Mistakes:
  • Confusing timeout with repeating tests
  • Thinking timeout skips tests
  • Assuming timeout marks tests as expected failures
2. Which of the following is the correct way to set a timeout of 5 seconds on a JUnit 5 test method?
easy
A. @Timeout(5)
B. @Timeout(5, SECONDS)
C. @Timeout(value = 5, unit = TimeUnit.SECONDS)
D. @Timeout(value = 5, unit = SECONDS)

Solution

  1. Step 1: Recall JUnit 5 @Timeout syntax

    The @Timeout annotation requires a value and a time unit specified as an enum from java.util.concurrent.TimeUnit.
  2. Step 2: Match correct syntax

    @Timeout(value = 5, unit = TimeUnit.SECONDS) uses named parameters with value=5 and unit=TimeUnit.SECONDS, which is correct syntax.
  3. Final Answer:

    @Timeout(value = 5, unit = TimeUnit.SECONDS) -> Option C
  4. Quick Check:

    Use named params with TimeUnit enum = C [OK]
Hint: Use named params and TimeUnit enum for timeout [OK]
Common Mistakes:
  • Omitting the time unit
  • Using wrong enum or missing TimeUnit prefix
  • Passing timeout as single unnamed parameter
3. Consider this JUnit 5 test method:
@Test
@Timeout(value = 2, unit = TimeUnit.SECONDS)
void testSleep() throws InterruptedException {
    Thread.sleep(3000);
}
What will happen when this test runs?
medium
A. The test will fail due to timeout after 2 seconds
B. The test will pass after sleeping 3 seconds
C. The test will fail immediately with an exception
D. The test will be skipped because of timeout

Solution

  1. Step 1: Analyze the timeout and sleep duration

    The test has a timeout of 2 seconds but sleeps for 3 seconds, which is longer than allowed.
  2. Step 2: Understand test behavior on timeout

    JUnit will stop the test after 2 seconds and mark it as failed due to timeout.
  3. Final Answer:

    The test will fail due to timeout after 2 seconds -> Option A
  4. Quick Check:

    Sleep longer than timeout causes failure = B [OK]
Hint: Sleep longer than timeout causes fail [OK]
Common Mistakes:
  • Thinking test passes despite long sleep
  • Assuming test fails immediately without waiting
  • Believing test is skipped instead of failed
4. This JUnit 5 test uses @Timeout(1) but does not compile. What is the error?
@Test
@Timeout(1)
void testMethod() {
    // test code
}
medium
A. Missing import for @Timeout annotation
B. Timeout annotation requires a time unit parameter
C. Timeout value must be a string, not an integer
D. Timeout annotation cannot be used on void methods

Solution

  1. Step 1: Check @Timeout annotation parameters

    The @Timeout annotation requires both a value and a time unit parameter in JUnit 5.
  2. Step 2: Identify missing time unit

    Using @Timeout(1) without specifying the time unit causes a compilation error.
  3. Final Answer:

    Timeout annotation requires a time unit parameter -> Option B
  4. Quick Check:

    Missing time unit parameter = A [OK]
Hint: Specify time unit with @Timeout [OK]
Common Mistakes:
  • Forgetting to specify time unit
  • Using @Timeout without time unit
  • Thinking @Timeout only works on non-void methods
5. You want to apply a timeout of 500 milliseconds to all test methods in a JUnit 5 test class. Which is the best way to do this?
hard
A. Add @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) on the test class
B. Use Thread.sleep(500) in each test method
C. Set a global timeout property in the JUnit configuration file
D. Add @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) on each test method

Solution

  1. Step 1: Understand class-level @Timeout usage

    JUnit 5 allows applying @Timeout at the class level to set a timeout for all test methods inside.
  2. Step 2: Compare options for efficiency

    Adding @Timeout on the class is simpler and ensures all tests have the timeout without repeating annotation.
  3. Final Answer:

    Add @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) on the test class -> Option A
  4. Quick Check:

    Class-level @Timeout applies to all tests = D [OK]
Hint: Put @Timeout on class to affect all tests [OK]
Common Mistakes:
  • Adding @Timeout repeatedly on each method
  • Trying to set timeout via sleep calls
  • Assuming global config sets timeout automatically
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard