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/.ci/test.sh b/.ci/test.sh index 87a605d84be..65ae84255cc 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -4,4 +4,4 @@ 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 --cov PIL --cov Tests --cov-report term --cov-report xml Tests 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/.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 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index da3eea06641..d22484dfcb0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,7 +53,7 @@ jobs: "3.10", ] include: - - { python-version: "3.12", PYTHONOPTIMIZE: 1, REVERSE: "--reverse" } + - { python-version: "3.12", PYTHONOPTIMIZE: 1 } - { python-version: "3.11", PYTHONOPTIMIZE: 2 } # Free-threaded - { python-version: "3.15t", disable-gil: true } @@ -123,9 +123,6 @@ jobs: - name: Test run: | - if [ $REVERSE ]; then - python3 -m pip install pytest-reverse - fi if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then xvfb-run -s '-screen 0 1024x768x24' sway& export WAYLAND_DISPLAY=wayland-1 @@ -135,7 +132,6 @@ jobs: fi env: PYTHONOPTIMIZE: ${{ matrix.PYTHONOPTIMIZE }} - REVERSE: ${{ matrix.REVERSE }} - name: Prepare to upload errors if: failure() diff --git a/Makefile b/Makefile index 6e050c715d2..fd106110899 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 @@ -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 diff --git a/Tests/test_file_avif.py b/Tests/test_file_avif.py index 727191153a1..5ada98bda38 100644 --- a/Tests/test_file_avif.py +++ b/Tests/test_file_avif.py @@ -772,6 +772,7 @@ def test_seek_errors(self) -> None: MAX_THREADS = os.cpu_count() or 1 +@pytest.mark.xdist_group(name="leak-group") @skip_unless_feature("avif") class TestAvifLeaks(PillowLeakTestCase): mem_limit = MAX_THREADS * 3 * 1024 diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 01fa090dc3a..da272da722f 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -12,6 +12,7 @@ from .helper import assert_image_equal_tofile, skip_unless_feature +@pytest.mark.xdist_group(name="imagegrab-group") class TestImageGrab: @pytest.mark.skipif( os.environ.get("USERNAME") == "ContainerAdministrator", diff --git a/pyproject.toml b/pyproject.toml index f4514925d1c..2f63f756b57 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 --dist=loadgroup" testpaths = [ "Tests", ]