Bird
Raised Fist0
JUnittesting~10 mins

Parallel test configuration in JUnit - Test Execution Trace

Choose your learning style10 modes available
Test Overview

This test demonstrates how to configure and run tests in parallel using JUnit 5. It verifies that two simple tests run concurrently without interfering with each other.

Test Code - JUnit 5
JUnit
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
import static org.junit.jupiter.api.Assertions.assertTrue;

@Execution(ExecutionMode.CONCURRENT)
public class ParallelTest {

    @Test
    void testOne() throws InterruptedException {
        Thread.sleep(500); // Simulate work
        assertTrue(true);
    }

    @Test
    void testTwo() throws InterruptedException {
        Thread.sleep(500); // Simulate work
        assertTrue(true);
    }
}
Execution Trace - 5 Steps
StepActionSystem StateAssertionResult
1JUnit test runner starts and detects tests annotated with @Execution(CONCURRENT)Test runner is ready to run tests in parallel—PASS
2Test runner launches testOne and testTwo simultaneously on separate threadsBoth tests are running concurrently—PASS
3testOne executes Thread.sleep(500) then asserts truetestOne is running and simulating workassertTrue(true) passesPASS
4testTwo executes Thread.sleep(500) then asserts truetestTwo is running and simulating workassertTrue(true) passesPASS
5Both tests complete successfully without interferenceTest runner collects resultsBoth tests passedPASS
Failure Scenario
Failing Condition: If tests are not configured to run in parallel or share mutable state causing interference
Execution Trace Quiz - 3 Questions
Test your understanding
What annotation enables parallel execution of tests in JUnit 5?
A@ParallelTest
B@RunWith(ParallelRunner.class)
C@Execution(ExecutionMode.CONCURRENT)
D@ConcurrentExecution
Key Result
Use @Execution(ExecutionMode.CONCURRENT) to run JUnit 5 tests in parallel safely, and avoid shared mutable state to prevent flaky tests.

Practice

(1/5)
1. What is the main purpose of configuring parallel test execution in JUnit?
easy
A. To disable all tests temporarily
B. To run tests one after another in a fixed order
C. To run multiple tests at the same time and save testing time
D. To automatically fix failing tests

Solution

  1. Step 1: Understand parallel test execution

    Parallel test execution means running tests simultaneously instead of one by one.
  2. Step 2: Identify the benefit

    Running tests at the same time saves overall testing time.
  3. Final Answer:

    To run multiple tests at the same time and save testing time -> Option C
  4. Quick Check:

    Parallel tests = faster testing [OK]
Hint: Parallel tests run simultaneously to save time [OK]
Common Mistakes:
  • Thinking parallel means disabling tests
  • Confusing parallel with sequential execution
  • Assuming parallel fixes test failures
2. Which annotation enables parallel execution of tests in JUnit 5?
easy
A. @Execution(ExecutionMode.CONCURRENT)
B. @RunWith(ParallelRunner.class)
C. @ParallelTest
D. @ConcurrentExecution

Solution

  1. Step 1: Recall JUnit 5 parallel test annotation

    JUnit 5 uses @Execution with ExecutionMode.CONCURRENT to run tests in parallel.
  2. Step 2: Check other options

    @RunWith is from JUnit 4, and @ParallelTest or @ConcurrentExecution do not exist in JUnit 5.
  3. Final Answer:

    @Execution(ExecutionMode.CONCURRENT) -> Option A
  4. Quick Check:

    @Execution(CONCURRENT) enables parallel tests [OK]
Hint: Use @Execution(ExecutionMode.CONCURRENT) for parallel tests [OK]
Common Mistakes:
  • Using JUnit 4 annotations in JUnit 5
  • Assuming @ParallelTest exists
  • Confusing annotation names
3. Given the following JUnit 5 test class, what will be the output when tests run with @Execution(ExecutionMode.CONCURRENT)?
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Execution(ExecutionMode.CONCURRENT)
public class SampleTest {

    @Test
    void testA() throws InterruptedException {
        Thread.sleep(100);
        System.out.println("Test A completed");
    }

    @Test
    void testB() {
        System.out.println("Test B completed");
    }
}
medium
A. Test A completed Test B completed (always in this order)
B. Test B completed Test A completed (order may vary due to concurrency)
C. Compilation error due to @Execution usage
D. Tests run sequentially ignoring @Execution

Solution

  1. Step 1: Understand @Execution(ExecutionMode.CONCURRENT)

    This annotation runs tests in parallel, so testA and testB start at the same time.
  2. Step 2: Analyze test behavior

    testA sleeps 100ms before printing, testB prints immediately. So testB likely prints first, but order can vary.
  3. Final Answer:

    Test B completed Test A completed (order may vary due to concurrency) -> Option B
  4. Quick Check:

    Parallel tests print order varies [OK]
Hint: Sleep delays show concurrency by changing print order [OK]
Common Mistakes:
  • Assuming tests run sequentially despite @Execution
  • Expecting fixed print order
  • Thinking @Execution causes compile errors
4. You configured @Execution(ExecutionMode.CONCURRENT) but tests fail intermittently due to shared data. What is the best fix?
medium
A. Make tests independent by avoiding shared mutable state
B. Remove @Execution and run tests sequentially
C. Add Thread.sleep() to all tests
D. Use @Disabled on all tests

Solution

  1. Step 1: Identify cause of intermittent failures

    Shared mutable data causes race conditions when tests run in parallel.
  2. Step 2: Apply best practice for parallel tests

    Tests must be independent and avoid shared mutable state to run safely in parallel.
  3. Final Answer:

    Make tests independent by avoiding shared mutable state -> Option A
  4. Quick Check:

    Independent tests avoid parallel conflicts [OK]
Hint: Avoid shared data for stable parallel tests [OK]
Common Mistakes:
  • Just removing parallel execution instead of fixing tests
  • Adding sleeps does not fix race conditions
  • Disabling tests hides the problem
5. You want to run tests in parallel but only within each test class, not across classes. Which configuration achieves this in JUnit 5?
hard
A. Annotate test classes with @Execution(ExecutionMode.SAME_THREAD)
B. Use @Execution(ExecutionMode.CONCURRENT) on each test method only
C. Set junit.jupiter.execution.parallel.enabled to false
D. Set junit.jupiter.execution.parallel.mode.default to concurrent and junit.jupiter.execution.parallel.mode.classes.default to same_thread

Solution

  1. Step 1: Understand JUnit 5 parallel config properties

    Property junit.jupiter.execution.parallel.mode.default controls method-level parallelism; junit.jupiter.execution.parallel.mode.classes.default controls class-level parallelism.
  2. Step 2: Configure methods parallel, classes sequential

    Setting methods to concurrent and classes to same_thread runs tests in parallel within classes but not across classes.
  3. Final Answer:

    Set junit.jupiter.execution.parallel.mode.default to concurrent and junit.jupiter.execution.parallel.mode.classes.default to same_thread -> Option D
  4. Quick Check:

    Methods parallel + classes sequential = parallel in class only [OK]
Hint: Configure method and class parallel modes separately [OK]
Common Mistakes:
  • Assuming @Execution on methods controls class-level parallelism
  • Disabling parallel execution entirely
  • Using SAME_THREAD on classes disables all parallelism
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