Skip to content

Commit 558e4fa

Browse files
[8.2.x] Add thread safety section to flaky test docs (#12362)
Co-authored-by: Nathan Goldbaum <[email protected]>
1 parent f0e7a07 commit 558e4fa

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

Diff for: AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ Mike Lundy
289289
Milan Lesnek
290290
Miro Hrončok
291291
mrbean-bremen
292+
Nathan Goldbaum
292293
Nathaniel Compton
293294
Nathaniel Waisbrot
294295
Ned Batchelder

Diff for: changelog/12356.doc.rst

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Added a subsection to the documentation for debugging flaky tests to mention
2+
lack of thread safety in pytest as a possible source of flakyness.

Diff for: doc/en/explanation/flaky.rst

+19-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ System state
1818

1919
Broadly speaking, a flaky test indicates that the test relies on some system state that is not being appropriately controlled - the test environment is not sufficiently isolated. Higher level tests are more likely to be flaky as they rely on more state.
2020

21-
Flaky tests sometimes appear when a test suite is run in parallel (such as use of pytest-xdist). This can indicate a test is reliant on test ordering.
21+
Flaky tests sometimes appear when a test suite is run in parallel (such as use of `pytest-xdist`_). This can indicate a test is reliant on test ordering.
2222

2323
- Perhaps a different test is failing to clean up after itself and leaving behind data which causes the flaky test to fail.
2424
- The flaky test is reliant on data from a previous test that doesn't clean up after itself, and in parallel runs that previous test is not always present
@@ -30,9 +30,22 @@ Overly strict assertion
3030

3131
Overly strict assertions can cause problems with floating point comparison as well as timing issues. :func:`pytest.approx` is useful here.
3232

33+
Thread safety
34+
~~~~~~~~~~~~~
3335

34-
Pytest features
35-
^^^^^^^^^^^^^^^
36+
pytest is single-threaded, executing its tests always in the same thread, sequentially, never spawning any threads itself.
37+
38+
Even in case of plugins which run tests in parallel, for example `pytest-xdist`_, usually work by spawning multiple *processes* and running tests in batches, without using multiple threads.
39+
40+
It is of course possible (and common) for tests and fixtures to spawn threads themselves as part of their testing workflow (for example, a fixture that starts a server thread in the background, or a test which executes production code that spawns threads), but some care must be taken:
41+
42+
* Make sure to eventually wait on any spawned threads -- for example at the end of a test, or during the teardown of a fixture.
43+
* Avoid using primitives provided by pytest (:func:`pytest.warns`, :func:`pytest.raises`, etc) from multiple threads, as they are not thread-safe.
44+
45+
If your test suite uses threads and your are seeing flaky test results, do not discount the possibility that the test is implicitly using global state in pytest itself.
46+
47+
Related features
48+
^^^^^^^^^^^^^^^^
3649

3750
Xfail strict
3851
~~~~~~~~~~~~
@@ -123,3 +136,6 @@ Resources
123136

124137
* `Flaky Tests at Google and How We Mitigate Them <https://testing.googleblog.com/2016/05/flaky-tests-at-google-and-how-we.html>`_ by John Micco, 2016
125138
* `Where do Google's flaky tests come from? <https://testing.googleblog.com/2017/04/where-do-our-flaky-tests-come-from.html>`_ by Jeff Listfield, 2017
139+
140+
141+
.. _pytest-xdist: https://github.com/pytest-dev/pytest-xdist

0 commit comments

Comments
 (0)