From 849cb9fcacd868624d0666b43b6b5bede68b19a5 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sun, 25 May 2025 23:26:33 +0300 Subject: [PATCH 1/6] Run tests in parallel with pytest-xdist --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 91f4750e46a..69e73de3152 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,6 +73,7 @@ optional-dependencies.tests = [ "pyroma>=5", "pytest", "pytest-cov", + "pytest-sugar", "pytest-timeout", "pytest-xdist", "trove-classifiers>=2024.10.12", @@ -208,7 +209,7 @@ lint.isort.required-imports = [ max_supported_python = "3.14" [tool.pytest.ini_options] -addopts = "-ra --color=auto" +addopts = "-ra --color=auto --numprocesses=auto" testpaths = [ "Tests", ] From b2e195a293013aec2e408d2aa127f7f5f300016e Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 27 Jun 2025 16:01:03 +0300 Subject: [PATCH 2/6] Install with tests extra --- .ci/build.sh | 1 - .ci/install.sh | 7 ------- .github/workflows/test-mingw.yml | 2 +- Makefile | 2 +- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index ae10cb67155..c172e513f68 100755 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -2,6 +2,5 @@ set -e -python3 -m coverage erase make clean make install-coverage diff --git a/.ci/install.sh b/.ci/install.sh index aeb5e65145d..30590449dda 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -24,14 +24,7 @@ sudo apt-get -qq install libfreetype6-dev liblcms2-dev libtiff-dev python3-tk\ python3 -m pip install --upgrade pip python3 -m pip install --upgrade wheel -python3 -m pip install coverage -python3 -m pip install defusedxml python3 -m pip install ipython -python3 -m pip install olefile -python3 -m pip install -U pytest -python3 -m pip install -U pytest-cov -python3 -m pip install -U pytest-timeout -python3 -m pip install pyroma # optional test dependencies, only install if there's a binary package. python3 -m pip install --only-binary=:all: numpy || true python3 -m pip install --only-binary=:all: pyarrow || true diff --git a/.github/workflows/test-mingw.yml b/.github/workflows/test-mingw.yml index e247414c8fc..baf0d1373fb 100644 --- a/.github/workflows/test-mingw.yml +++ b/.github/workflows/test-mingw.yml @@ -78,7 +78,7 @@ jobs: pushd depends && ./install_extra_test_images.sh && popd - name: Build Pillow - run: CFLAGS="-coverage" python3 -m pip install . + run: CFLAGS="-coverage" python3 -m pip install .[tests] - name: Test Pillow run: | diff --git a/Makefile b/Makefile index 6e050c715d2..b4456437174 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,7 @@ install: .PHONY: install-coverage install-coverage: - CFLAGS="-coverage -Werror=implicit-function-declaration" python3 -m pip -v install . + CFLAGS="-coverage -Werror=implicit-function-declaration" python3 -m pip -v install .[tests] python3 selftest.py .PHONY: debug From 9aec4db9cbd77b95c9d3fa242e6ffb215dd23e3c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sun, 14 Dec 2025 18:10:39 +0200 Subject: [PATCH 3/6] Disable xdist for valgrind Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- .github/workflows/test-valgrind-memory.yml | 7 ++++++- .github/workflows/test-valgrind.yml | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-valgrind-memory.yml b/.github/workflows/test-valgrind-memory.yml index bd244aa5a57..66ecac4bda8 100644 --- a/.github/workflows/test-valgrind-memory.yml +++ b/.github/workflows/test-valgrind-memory.yml @@ -56,5 +56,10 @@ jobs: run: | # The Pillow user in the docker container is UID 1001 sudo chown -R 1001 $GITHUB_WORKSPACE - docker run --name pillow_container -e "PILLOW_VALGRIND_TEST=true" -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} /Pillow/depends/docker-test-valgrind-memory.sh + docker run --name pillow_container \ + -e "PILLOW_VALGRIND_TEST=true" \ + -e "PYTEST_ADDOPTS=-n0" \ + -v $GITHUB_WORKSPACE:/Pillow \ + pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} \ + bash -c "python3 -m pip install pytest-xdist && /Pillow/depends/docker-test-valgrind-memory.sh" sudo chown -R runner $GITHUB_WORKSPACE diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index 81cfb84566c..6fe4935e8db 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -54,5 +54,9 @@ jobs: run: | # The Pillow user in the docker container is UID 1001 sudo chown -R 1001 $GITHUB_WORKSPACE - docker run --name pillow_container -e "PILLOW_VALGRIND_TEST=true" -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} + docker run --name pillow_container \ + -e "PILLOW_VALGRIND_TEST=true" \ + -e "PYTEST_ADDOPTS=-n0" \ + -v $GITHUB_WORKSPACE:/Pillow \ + pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} sudo chown -R runner $GITHUB_WORKSPACE From a5f9a06516d27d86103087b27df1977b21473510 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:36:27 +0200 Subject: [PATCH 4/6] Remove make test-p --- Makefile | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Makefile b/Makefile index b4456437174..fd106110899 100644 --- a/Makefile +++ b/Makefile @@ -97,12 +97,6 @@ test: python3 -c "import pytest" > /dev/null 2>&1 || python3 -m pip install pytest python3 -m pytest -qq -.PHONY: test-p -test-p: - python3 -c "import xdist" > /dev/null 2>&1 || python3 -m pip install pytest-xdist - python3 -m pytest -qq -n auto - - .PHONY: valgrind valgrind: python3 -c "import pytest_valgrind" > /dev/null 2>&1 || python3 -m pip install pytest-valgrind From c185e6355913090d599225314e4e9d0218192dc8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 13 Feb 2026 22:43:31 +1100 Subject: [PATCH 5/6] Switch to loadscope --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 69e73de3152..95609a2eb7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -209,7 +209,7 @@ lint.isort.required-imports = [ max_supported_python = "3.14" [tool.pytest.ini_options] -addopts = "-ra --color=auto --numprocesses=auto" +addopts = "-ra --color=auto --numprocesses=auto --dist=loadscope" testpaths = [ "Tests", ] From 244f7857e061bf285eb2399f6204405e07e13c5a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 14 Feb 2026 21:44:29 +0200 Subject: [PATCH 6/6] Run PillowLeakTestCases separetely without xdist --- .ci/test.sh | 3 ++- Tests/helper.py | 1 + pyproject.toml | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.ci/test.sh b/.ci/test.sh index 87a605d84be..fb03223db6d 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -4,4 +4,5 @@ set -e python3 -c "from PIL import Image" -python3 -bb -m pytest -vv -x -W always --cov PIL --cov Tests --cov-report term --cov-report xml Tests $REVERSE +python3 -bb -m pytest -vv -x -W always Tests -m "isolated" -n0 +python3 -bb -m pytest -vv -x -W always Tests -m "not isolated" --cov PIL --cov Tests --cov-report term --cov-report xml $REVERSE diff --git a/Tests/helper.py b/Tests/helper.py index d77b4b807ec..45058a1cc26 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -216,6 +216,7 @@ def mark_if_feature_version( return pytest.mark.pil_noop_mark() +@pytest.mark.isolated @pytest.mark.skipif(sys.platform.startswith("win32"), reason="Requires Unix or macOS") class PillowLeakTestCase: # requires unix/macOS diff --git a/pyproject.toml b/pyproject.toml index 95609a2eb7d..93c731b7440 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -210,6 +210,9 @@ max_supported_python = "3.14" [tool.pytest.ini_options] addopts = "-ra --color=auto --numprocesses=auto --dist=loadscope" +markers = [ + "isolated: tests that are not compatible with pytest-xdist (deselect with '-m \"not isolated\"')", +] testpaths = [ "Tests", ]