diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index e173dfcc..369a25da 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -144,4 +144,4 @@ jobs: #---------------------------------------------- - name: Test with pytest run: | - poetry run python -m pytest -vv --cov=ethicml --cov-fail-under=80 tests/ + poetry run python -m pytest -vv -n 2 --dist loadgroup --cov=ethicml --cov-fail-under=80 tests/ diff --git a/poetry.lock b/poetry.lock index e32f9509..1d95fb9b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -161,6 +161,17 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "execnet" +version = "1.9.0" +description = "execnet: rapid multi-Python deployment" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +testing = ["pre-commit"] + [[package]] name = "fairlearn" version = "0.7.0" @@ -374,7 +385,7 @@ python-versions = ">=3.6" [[package]] name = "mypy" -version = "0.950" +version = "0.960" description = "Optional static typing for Python" category = "dev" optional = false @@ -632,6 +643,36 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] +[[package]] +name = "pytest-forked" +version = "1.4.0" +description = "run tests in isolated forked subprocesses" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +py = "*" +pytest = ">=3.10" + +[[package]] +name = "pytest-xdist" +version = "2.5.0" +description = "pytest xdist plugin for distributed testing and loop-on-failing modes" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +execnet = ">=1.1" +pytest = ">=6.2.0" +pytest-forked = "*" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -959,7 +1000,7 @@ ci = ["fairlearn", "pytest", "pytest-cov", "cloudpickle", "omegaconf"] [metadata] lock-version = "1.1" python-versions = ">=3.7.1,<3.11" -content-hash = "bccffc9af101600deafb2ea6057d3f51b6c6bef1422f5693580a320b3e167d24" +content-hash = "817444e15e529a88ae23327db5c1cef86b61c18245ec2c33add8ada98ffa3c4c" [metadata.files] antlr4-python3-runtime = [ @@ -1081,6 +1122,10 @@ distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, ] +execnet = [ + {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, + {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, +] fairlearn = [ {file = "fairlearn-0.7.0-py3-none-any.whl", hash = "sha256:ac27e89952b5c5e3a3fdee05bfbadacfacc30fe00b917b057e2f605920ef5e44"}, {file = "fairlearn-0.7.0.tar.gz", hash = "sha256:a0d287d34275b7b2ae29d084754e3eca3a47289f774c77229921b10c7c52127e"}, @@ -1258,29 +1303,29 @@ mccabe = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] mypy = [ - {file = "mypy-0.950-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b"}, - {file = "mypy-0.950-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0"}, - {file = "mypy-0.950-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22"}, - {file = "mypy-0.950-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb"}, - {file = "mypy-0.950-cp310-cp310-win_amd64.whl", hash = "sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334"}, - {file = "mypy-0.950-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f"}, - {file = "mypy-0.950-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc"}, - {file = "mypy-0.950-cp36-cp36m-win_amd64.whl", hash = "sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2"}, - {file = "mypy-0.950-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed"}, - {file = "mypy-0.950-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075"}, - {file = "mypy-0.950-cp37-cp37m-win_amd64.whl", hash = "sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b"}, - {file = "mypy-0.950-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d"}, - {file = "mypy-0.950-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a"}, - {file = "mypy-0.950-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605"}, - {file = "mypy-0.950-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2"}, - {file = "mypy-0.950-cp38-cp38-win_amd64.whl", hash = "sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff"}, - {file = "mypy-0.950-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8"}, - {file = "mypy-0.950-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038"}, - {file = "mypy-0.950-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2"}, - {file = "mypy-0.950-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519"}, - {file = "mypy-0.950-cp39-cp39-win_amd64.whl", hash = "sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef"}, - {file = "mypy-0.950-py3-none-any.whl", hash = "sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb"}, - {file = "mypy-0.950.tar.gz", hash = "sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de"}, + {file = "mypy-0.960-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3a3e525cd76c2c4f90f1449fd034ba21fcca68050ff7c8397bb7dd25dd8b8248"}, + {file = "mypy-0.960-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7a76dc4f91e92db119b1be293892df8379b08fd31795bb44e0ff84256d34c251"}, + {file = "mypy-0.960-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffdad80a92c100d1b0fe3d3cf1a4724136029a29afe8566404c0146747114382"}, + {file = "mypy-0.960-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7d390248ec07fa344b9f365e6ed9d205bd0205e485c555bed37c4235c868e9d5"}, + {file = "mypy-0.960-cp310-cp310-win_amd64.whl", hash = "sha256:925aa84369a07846b7f3b8556ccade1f371aa554f2bd4fb31cb97a24b73b036e"}, + {file = "mypy-0.960-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:239d6b2242d6c7f5822163ee082ef7a28ee02e7ac86c35593ef923796826a385"}, + {file = "mypy-0.960-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f1ba54d440d4feee49d8768ea952137316d454b15301c44403db3f2cb51af024"}, + {file = "mypy-0.960-cp36-cp36m-win_amd64.whl", hash = "sha256:cb7752b24528c118a7403ee955b6a578bfcf5879d5ee91790667c8ea511d2085"}, + {file = "mypy-0.960-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:826a2917c275e2ee05b7c7b736c1e6549a35b7ea5a198ca457f8c2ebea2cbecf"}, + {file = "mypy-0.960-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3eabcbd2525f295da322dff8175258f3fc4c3eb53f6d1929644ef4d99b92e72d"}, + {file = "mypy-0.960-cp37-cp37m-win_amd64.whl", hash = "sha256:f47322796c412271f5aea48381a528a613f33e0a115452d03ae35d673e6064f8"}, + {file = "mypy-0.960-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2c7f8bb9619290836a4e167e2ef1f2cf14d70e0bc36c04441e41487456561409"}, + {file = "mypy-0.960-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbfb873cf2b8d8c3c513367febde932e061a5f73f762896826ba06391d932b2a"}, + {file = "mypy-0.960-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc537885891382e08129d9862553b3d00d4be3eb15b8cae9e2466452f52b0117"}, + {file = "mypy-0.960-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:481f98c6b24383188c928f33dd2f0776690807e12e9989dd0419edd5c74aa53b"}, + {file = "mypy-0.960-cp38-cp38-win_amd64.whl", hash = "sha256:29dc94d9215c3eb80ac3c2ad29d0c22628accfb060348fd23d73abe3ace6c10d"}, + {file = "mypy-0.960-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:33d53a232bb79057f33332dbbb6393e68acbcb776d2f571ba4b1d50a2c8ba873"}, + {file = "mypy-0.960-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d645e9e7f7a5da3ec3bbcc314ebb9bb22c7ce39e70367830eb3c08d0140b9ce"}, + {file = "mypy-0.960-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:85cf2b14d32b61db24ade8ac9ae7691bdfc572a403e3cb8537da936e74713275"}, + {file = "mypy-0.960-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a85a20b43fa69efc0b955eba1db435e2ffecb1ca695fe359768e0503b91ea89f"}, + {file = "mypy-0.960-cp39-cp39-win_amd64.whl", hash = "sha256:0ebfb3f414204b98c06791af37a3a96772203da60636e2897408517fcfeee7a8"}, + {file = "mypy-0.960-py3-none-any.whl", hash = "sha256:bfd4f6536bd384c27c392a8b8f790fd0ed5c0cf2f63fc2fed7bce56751d53026"}, + {file = "mypy-0.960.tar.gz", hash = "sha256:d4fccf04c1acf750babd74252e0f2db6bd2ac3aa8fe960797d9f3ef41cf2bfd4"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1442,6 +1487,14 @@ pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] +pytest-forked = [ + {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, + {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, +] +pytest-xdist = [ + {file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"}, + {file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"}, +] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, diff --git a/pyproject.toml b/pyproject.toml index 6e24e372..831b37e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,7 @@ pytest-cov = ">=2.6,<4.0" python-type-stubs = {git = "https://github.com/wearepal/python-type-stubs.git", rev = "316dad4"} types-Pillow = "^9.0.15" omegaconf = ">=2.2.1" +pytest-xdist = "^2.5.0" [tool.black] line-length = 100 diff --git a/tests/models_test/inprocess_test/models_inprocessing_test.py b/tests/models_test/inprocess_test/models_inprocessing_test.py index 5cf702e9..0830f12b 100644 --- a/tests/models_test/inprocess_test/models_inprocessing_test.py +++ b/tests/models_test/inprocess_test/models_inprocessing_test.py @@ -148,6 +148,7 @@ def test_kamiran_weights(toy_train_test: TrainTestPair): @pytest.mark.parametrize("name,model,num_pos", INPROCESS_TESTS) +@pytest.mark.xdist_group("in_model_files") def test_inprocess_sep_train_pred( toy_train_val: TrainValPair, name: str, model: InAlgorithm, num_pos: int ): @@ -217,6 +218,7 @@ def kamishima_gen() -> Generator[Kamishima, None, None]: @pytest.mark.slow +@pytest.mark.xdist_group("in_model_files") def test_kamishima(toy_train_test: TrainTestPair, kamishima_gen: Kamishima) -> None: """Test Kamishima.""" train, test = toy_train_test @@ -266,6 +268,7 @@ def get_hyperparameters(self) -> HyperParamType: @pytest.mark.slow +@pytest.mark.xdist_group("results_files") def test_threaded_agarwal(): """Test threaded agarwal.""" models: List[InAlgorithmSubprocess] = [ diff --git a/tests/models_test/postprocess_test/models_postprocessing_test.py b/tests/models_test/postprocess_test/models_postprocessing_test.py index 2d29b5b7..e3e235e2 100644 --- a/tests/models_test/postprocess_test/models_postprocessing_test.py +++ b/tests/models_test/postprocess_test/models_postprocessing_test.py @@ -63,6 +63,7 @@ def test_post( PostprocessTest(post_model=Hardt(), name="Hardt", num_pos=35), ], ) +@pytest.mark.xdist_group("post_model_files") def test_post_sep_fit_pred( toy_train_val: TrainValPair, post_model: PostAlgorithm, name: str, num_pos: int ) -> None: diff --git a/tests/models_test/preprocess_test/models_preprocessing_test.py b/tests/models_test/preprocess_test/models_preprocessing_test.py index d9ffc1eb..04987e0d 100644 --- a/tests/models_test/preprocess_test/models_preprocessing_test.py +++ b/tests/models_test/preprocess_test/models_preprocessing_test.py @@ -112,6 +112,7 @@ def test_pre(toy_train_test: TrainTestPair, model: PreAlgorithm, name: str, num_ @pytest.mark.parametrize("model,name,num_pos", METHOD_LIST) +@pytest.mark.xdist_group("pre_model_files") def test_pre_sep_fit_transform( toy_train_val: TrainValPair, model: PreAlgorithm, name: str, num_pos: int ): diff --git a/tests/run_algorithm_test.py b/tests/run_algorithm_test.py index 90a9260b..8bf0b9a8 100644 --- a/tests/run_algorithm_test.py +++ b/tests/run_algorithm_test.py @@ -53,6 +53,7 @@ def test_run_parallel(toy_train_val: em.TrainValPair): @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_empty_evaluate(): """Test empty evaluate.""" empty_result = em.evaluate_models([em.Toy()], repeats=3) @@ -67,6 +68,7 @@ def test_empty_evaluate(): @pytest.mark.parametrize("repeats", [1, 2, 3]) @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_alg_repeats_error(repeats: int): """Add a test to check that the right number of reults are produced with repeats.""" dataset = em.Adult(split=em.Adult.Splits.RACE_BINARY) @@ -92,6 +94,7 @@ def test_run_alg_repeats_error(repeats: int): @pytest.mark.parametrize("on", ["data", "model", "both"]) @pytest.mark.parametrize("repeats", [2, 3, 5]) @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_repeats(repeats: int, on: Literal["data", "model", "both"]): """Check the repeat_on arg.""" dataset = em.Adult(split=em.Adult.Splits.RACE_BINARY) @@ -124,6 +127,7 @@ def test_run_repeats(repeats: int, on: Literal["data", "model", "both"]): @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_alg_suite_scaler(): """Test run alg suite.""" dataset = em.Adult(split=em.Adult.Splits.RACE_BINARY) @@ -160,6 +164,7 @@ def test_run_alg_suite_scaler(): @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_alg_suite(): """Test run alg suite.""" dataset = em.Adult(split=em.Adult.Splits.RACE_BINARY) @@ -202,6 +207,7 @@ def test_run_alg_suite(): @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_alg_suite_wrong_metrics(): """Test run alg suite wrong metrics.""" datasets: List[em.Dataset] = [em.Toy(), em.Adult()] @@ -223,6 +229,7 @@ def test_run_alg_suite_wrong_metrics(): @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_alg_suite_err_handling(): """Test run alg suite handles when an err is thrown.""" @@ -262,6 +269,7 @@ def get_name(self) -> str: @pytest.mark.slow @pytest.mark.usefixtures("results_cleanup") +@pytest.mark.xdist_group("results_files") def test_run_alg_suite_no_pipeline(): """Run alg suite while avoiding the 'fair pipeline'.""" datasets: List[em.Dataset] = [em.Toy(), em.Adult()] diff --git a/tests/visualisation_test.py b/tests/visualisation_test.py index 9edc5150..38674456 100644 --- a/tests/visualisation_test.py +++ b/tests/visualisation_test.py @@ -34,6 +34,7 @@ @pytest.mark.slow @pytest.mark.usefixtures("plot_cleanup") # fixtures are defined in `tests/conftest.py` +@pytest.mark.xdist_group("results_files") def test_plot_tsne(toy_train_test: TrainTestPair): """Test plot.""" train, _ = toy_train_test @@ -41,6 +42,7 @@ def test_plot_tsne(toy_train_test: TrainTestPair): @pytest.mark.usefixtures("plot_cleanup") # fixtures are defined in `tests/conftest.py` +@pytest.mark.xdist_group("results_files") def test_plot_no_tsne(toy_train_test: TrainTestPair): """Test plot.""" train, _ = toy_train_test @@ -49,6 +51,7 @@ def test_plot_no_tsne(toy_train_test: TrainTestPair): @pytest.mark.usefixtures("plot_cleanup") +@pytest.mark.xdist_group("results_files") def test_joint_plot(toy_train_test: TrainTestPair): """Test joint plot.""" train, _ = toy_train_test @@ -57,6 +60,7 @@ def test_joint_plot(toy_train_test: TrainTestPair): @pytest.mark.slow @pytest.mark.usefixtures("plot_cleanup") +@pytest.mark.xdist_group("results_files") def test_multijoint_plot(toy_train_test: TrainTestPair): """Test joint plot.""" train, _ = toy_train_test @@ -64,6 +68,7 @@ def test_multijoint_plot(toy_train_test: TrainTestPair): @pytest.mark.usefixtures("plot_cleanup") +@pytest.mark.xdist_group("results_files") def test_label_plot(): """Test label plot.""" data: DataTuple = load_data(Adult()) @@ -74,6 +79,7 @@ def test_label_plot(): @pytest.mark.usefixtures("plot_cleanup") +@pytest.mark.xdist_group("results_files") def test_plot_evals(): """Test plot evals.""" results: Results = evaluate_models(