Flaky test detection in JUnit - Build an Automation Script
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class FlakyTestDetection { // Simulated flaky test method boolean flakyTest() { // Randomly pass or fail return Math.random() > 0.5; } @Test void detectFlakyTest() { int passCount = 0; int failCount = 0; int runs = 5; for (int i = 0; i < runs; i++) { if (flakyTest()) { passCount++; } else { failCount++; } } assertTrue(passCount > 0, "Test should pass at least once"); assertTrue(failCount > 0, "Test should fail at least once to confirm flakiness"); } }
This code defines a flakyTest() method that randomly passes or fails to simulate flakiness.
The detectFlakyTest() method runs this flaky test 5 times in a loop.
It counts how many times the test passes and fails.
Then it asserts that the test passed at least once and failed at least once.
This confirms the test is flaky because it does not always behave the same.
Using a loop inside a single test method keeps the code simple and clear.
Now add data-driven testing with 3 different flaky test scenarios using @ParameterizedTest
Practice
What is a flaky test in JUnit?
Solution
Step 1: Understand flaky test behavior
A flaky test is one that does not have consistent results; it may pass or fail unpredictably even if the code hasn't changed.Step 2: Identify the correct definition
Among the options, only D describes this behavior accurately.Final Answer:
A test that sometimes passes and sometimes fails without code changes -> Option BQuick Check:
Flaky test = inconsistent pass/fail [OK]
- Thinking flaky tests always fail
- Confusing flaky tests with slow tests
- Assuming flaky tests run only once
Which JUnit feature helps detect flaky tests by rerunning failed tests automatically?
Solution
Step 1: Identify rerun features in JUnit
JUnit provides RetryRule or can use @RepeatedTest to rerun tests multiple times to detect flaky behavior.Step 2: Eliminate unrelated options
@BeforeAll runs setup once, @Test timeout limits test time, and @Ignore skips tests, so they don't detect flaky tests.Final Answer:
JUnit RetryRule or @RepeatedTest -> Option AQuick Check:
RetryRule reruns tests to detect flakes [OK]
- Confusing @BeforeAll with retry logic
- Using @Ignore to detect flaky tests
- Thinking timeout detects flakiness
Consider this JUnit test snippet using a retry rule to detect flaky tests:
public class FlakyTest {
private int runCount = 0;
@Rule
public RetryRule retryRule = new RetryRule(3);
@Test
public void testFlaky() {
runCount++;
assertTrue(runCount >= 2);
}
}What will be the test result when run?
Solution
Step 1: Analyze runCount increment and assertion
On first run, runCount is 1, so assertTrue(runCount >= 2) fails. RetryRule reruns test up to 3 times.Step 2: Check retry behavior
On second run, runCount is 2, assertion passes, so test passes after one retry.Final Answer:
Test passes after retrying once -> Option DQuick Check:
Retry allows flaky test to pass on retry [OK]
- Assuming test passes on first try
- Ignoring retry rule effect
- Thinking test fails after all retries
Identify the problem in this JUnit test intended to detect flaky tests by retrying:
@Rule
public RetryRule retryRule = new RetryRule(3);
@Test
public void testFlaky() {
int count = 0;
count++;
assertTrue(count > 1);
}Solution
Step 1: Analyze count variable scope
Count is a local variable inside the test method, so it resets to 0 on every retry.Step 2: Understand retry effect on count
Since count resets each time, count++ makes it 1, so assertTrue(count > 1) always fails, retry won't help.Final Answer:
The count variable resets on each test run, so retry never passes -> Option CQuick Check:
Local variables reset each retry causing failure [OK]
- Assuming retry fixes all failures
- Ignoring variable reset on retries
- Confusing retry annotations
You want to detect flaky tests in your JUnit suite by running each test 5 times and marking it flaky if it fails at least once. Which approach is best?
Solution
Step 1: Understand flaky test detection by multiple runs
Running tests multiple times helps catch intermittent failures indicating flakiness.Step 2: Choose correct JUnit feature
@RepeatedTest(5) runs the test 5 times; by recording failures during these runs, flaky tests can be detected.Final Answer:
Use @RepeatedTest(5) and record failures to identify flaky tests -> Option AQuick Check:
Multiple runs with @RepeatedTest detect flaky tests [OK]
- Using @Ignore disables tests instead of detecting flakes
- Relying on @Timeout for flaky detection
- Resetting state without multiple runs
Ready to prove it?
Pass the test and this pattern moves unknown
