Sometimes tests fail randomly even if the code is correct. Detecting and retrying these flaky tests helps keep your test results reliable.
Flaky test detection and retry in PyTest
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
PyTest
import pytest @pytest.mark.flaky(reruns=number_of_retries) def test_example(): # test code here
The @pytest.mark.flaky decorator tells pytest to rerun the test if it fails.
Set reruns to the number of times you want to retry the test.
Examples
PyTest
import pytest @pytest.mark.flaky(reruns=2) def test_random_fail(): import random assert random.choice([True, False])
PyTest
import pytest @pytest.mark.flaky(reruns=3, reruns_delay=1) def test_with_delay(): assert False # always fails
Sample Program
This test sometimes fails because it randomly chooses True or False. Pytest will retry it up to 3 times if it fails.
PyTest
import pytest import random @pytest.mark.flaky(reruns=3) def test_flaky(): # This test randomly fails assert random.choice([True, False]) if __name__ == "__main__": pytest.main(["-v", __file__])
Important Notes
Use retries sparingly to avoid hiding real problems.
Flaky tests should be fixed eventually, not just retried.
Pytest-flaky plugin or built-in rerunfailures plugin can be used for retries.
Summary
Flaky tests fail randomly and need special handling.
Use @pytest.mark.flaky(reruns=N) to retry tests automatically.
Retries help reduce false failures but don't replace fixing flaky tests.
Practice
1. What is the main purpose of marking a test as flaky in pytest using
@pytest.mark.flaky(reruns=N)?easy
Solution
Step 1: Understand the flaky test concept
Flaky tests fail randomly due to timing or environment issues, so retries help reduce false failures.Step 2: Analyze the effect of
This decorator tells pytest to rerun the test up to N times if it fails, increasing chances of passing despite flakiness.@pytest.mark.flaky(reruns=N)Final Answer:
To automatically retry the test N times if it fails -> Option BQuick Check:
Flaky test retry = reruns N times [OK]
Hint: Retries mean automatic rerun on failure [OK]
Common Mistakes:
- Confusing flaky with skipped tests
- Thinking flaky marks slow tests
- Assuming flaky disables retries
2. Which of the following is the correct syntax to retry a flaky test 3 times in pytest?
easy
Solution
Step 1: Recall the correct decorator name and parameter
The correct decorator is@pytest.mark.flakywith parameterrerunsto specify retry count.Step 2: Match syntax with options
@pytest.mark.flaky(reruns=3) uses@pytest.mark.flaky(reruns=3), which is the correct syntax for retrying 3 times.Final Answer:
@pytest.mark.flaky(reruns=3) -> Option DQuick Check:
Decorator name + reruns param = correct syntax [OK]
Hint: Use @pytest.mark.flaky with reruns param [OK]
Common Mistakes:
- Using @pytest.retry instead of @pytest.mark.flaky
- Using wrong parameter names like tries
- Missing the mark prefix
3. Given this pytest test code snippet, what will be the output if the test randomly fails once and passes on retry?
import pytest
@pytest.mark.flaky(reruns=2)
def test_random():
import random
assert random.choice([True, False])medium
Solution
Step 1: Understand the flaky decorator effect
The test will rerun up to 2 times if it fails, allowing multiple chances to pass.Step 2: Analyze the random assertion
The assertion randomly passes or fails. If it fails once, retry can pass if random returns True on retry.Final Answer:
Test may pass after 1 or 2 retries if random returns True -> Option AQuick Check:
Retries allow passing despite random failure [OK]
Hint: Retries give multiple chances to pass random failures [OK]
Common Mistakes:
- Assuming flaky skips tests
- Thinking test always fails on first try
- Ignoring retry count effect
4. You wrote this flaky test with retry but it never retries on failure. What is the error?
import pytest
@pytest.mark.flaky(rerun=3)
def test_example():
assert Falsemedium
Solution
Step 1: Check the decorator parameter spelling
The correct parameter for retry count isreruns, notrerun.Step 2: Understand impact of wrong parameter
Usingrerunis ignored by pytest, so no retries happen despite failures.Final Answer:
The parameter name should be 'reruns', not 'rerun' -> Option CQuick Check:
Correct param spelling = reruns [OK]
Hint: Check exact parameter spelling: reruns, not rerun [OK]
Common Mistakes:
- Misspelling reruns parameter
- Using wrong decorator name
- Expecting retries on always failing test
5. You want to reduce false failures from a flaky test that sometimes fails due to timing issues. Which approach best combines flaky test detection and retry in pytest?
hard
Solution
Step 1: Understand flaky test retry purpose
Retries help reduce false failures by rerunning tests that fail randomly.Step 2: Combine retry with test stabilization
Adding explicit waits addresses timing issues, improving test stability alongside retries.Step 3: Evaluate other options
Skipping ignores tests, removing retries loses retry benefit, and reruns=0 disables retries.Final Answer:
Use @pytest.mark.flaky(reruns=3) and add explicit wait in test code -> Option AQuick Check:
Retries + waits = best flaky test handling [OK]
Hint: Combine retries with waits to fix flaky timing issues [OK]
Common Mistakes:
- Skipping flaky tests instead of fixing
- Disabling retries by setting reruns=0
- Ignoring timing issues causing flakiness
