120 lines
4.2 KiB
Diff
120 lines
4.2 KiB
Diff
From 11874096bffd7e935f0191086f7e6403347d0074 Mon Sep 17 00:00:00 2001
|
|
From: Roman Inflianskas <rominf@pm.me>
|
|
Date: Wed, 2 Oct 2024 14:15:13 +0300
|
|
Subject: [PATCH] tests: reorder to unpin pytest
|
|
|
|
Fix: #3035
|
|
|
|
Rearrange test items so that forked tests come before normal tests
|
|
within their respective modules.
|
|
Swap the last forked test with the last normal test if necessary.
|
|
|
|
Workaround to unpin pytest. See:
|
|
https://github.com/pytest-dev/pytest/issues/9621,
|
|
https://github.com/pytest-dev/pytest-forked/issues/67, and specifically:
|
|
https://github.com/pytest-dev/pytest-forked/issues/67#issuecomment-1964718720
|
|
---
|
|
requirements-devenv.txt | 1 -
|
|
tests/conftest.py | 39 +++++++++++++++++++++++++++++++++++++++
|
|
tox.ini | 10 ----------
|
|
3 files changed, 39 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/requirements-devenv.txt b/requirements-devenv.txt
|
|
index 29d3f15e..5696567a 100644
|
|
--- a/requirements-devenv.txt
|
|
+++ b/requirements-devenv.txt
|
|
@@ -1,5 +1,4 @@
|
|
-r requirements-linting.txt
|
|
-r requirements-testing.txt
|
|
mockupdb # required by `pymongo` tests that are enabled by `pymongo` from linter requirements
|
|
-pytest<7.0.0 # https://github.com/pytest-dev/pytest/issues/9621; see tox.ini
|
|
pytest-asyncio
|
|
diff --git a/tests/conftest.py b/tests/conftest.py
|
|
index 64527c1e..ade4a6c3 100644
|
|
--- a/tests/conftest.py
|
|
+++ b/tests/conftest.py
|
|
@@ -2,6 +2,7 @@ import json
|
|
import os
|
|
import socket
|
|
import warnings
|
|
+from collections import OrderedDict
|
|
from threading import Thread
|
|
from contextlib import contextmanager
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
@@ -645,3 +646,41 @@ class ApproxDict(dict):
|
|
|
|
def __ne__(self, other):
|
|
return not self.__eq__(other)
|
|
+
|
|
+
|
|
+def pytest_collection_modifyitems(config, items):
|
|
+ """
|
|
+ Rearrange test items so that forked tests come before normal tests within their respective modules.
|
|
+ Swap the last forked test with the last normal test if necessary.
|
|
+
|
|
+ Workaround to unpin pytest. See:
|
|
+ https://github.com/pytest-dev/pytest/issues/9621,
|
|
+ https://github.com/pytest-dev/pytest-forked/issues/67, and specifically:
|
|
+ https://github.com/pytest-dev/pytest-forked/issues/67#issuecomment-1964718720
|
|
+ """
|
|
+ module_states = OrderedDict()
|
|
+
|
|
+ for idx in range(len(items)):
|
|
+ item = items[idx]
|
|
+ current_module = item.module.__name__
|
|
+
|
|
+ if current_module not in module_states:
|
|
+ module_states[current_module] = {"forked": [], "normal": []}
|
|
+
|
|
+ if "forked" in item.keywords:
|
|
+ module_states[current_module]["forked"].append(idx)
|
|
+ else:
|
|
+ module_states[current_module]["normal"].append(idx)
|
|
+
|
|
+ # Swap the last forked test with the last normal test if necessary
|
|
+ for states in module_states.values():
|
|
+ if states["forked"] and states["normal"]:
|
|
+ last_forked_idx = states["forked"][-1]
|
|
+ last_normal_idx = states["normal"][-1]
|
|
+
|
|
+ if last_forked_idx > last_normal_idx:
|
|
+ # Swap the items
|
|
+ items[last_forked_idx], items[last_normal_idx] = (
|
|
+ items[last_normal_idx],
|
|
+ items[last_forked_idx],
|
|
+ )
|
|
diff --git a/tox.ini b/tox.ini
|
|
index 8857d1cb..d78f0aaf 100644
|
|
--- a/tox.ini
|
|
+++ b/tox.ini
|
|
@@ -290,19 +290,10 @@ deps =
|
|
# === Common ===
|
|
py3.8-common: hypothesis
|
|
common: pytest-asyncio
|
|
- # See https://github.com/pytest-dev/pytest/issues/9621
|
|
- # and https://github.com/pytest-dev/pytest-forked/issues/67
|
|
- # for justification of the upper bound on pytest
|
|
- {py3.6,py3.7,py3.8,py3.9,py3.10,py3.11,py3.12}-common: pytest<7.0.0
|
|
- py3.13-common: pytest
|
|
|
|
# === Gevent ===
|
|
{py3.6,py3.7,py3.8,py3.9,py3.10,py3.11}-gevent: gevent>=22.10.0, <22.11.0
|
|
{py3.12}-gevent: gevent
|
|
- # See https://github.com/pytest-dev/pytest/issues/9621
|
|
- # and https://github.com/pytest-dev/pytest-forked/issues/67
|
|
- # for justification of the upper bound on pytest
|
|
- {py3.6,py3.7,py3.8,py3.9,py3.10,py3.11,py3.12}-gevent: pytest<7.0.0
|
|
|
|
# === Integrations ===
|
|
|
|
@@ -372,7 +363,6 @@ deps =
|
|
celery-latest: Celery
|
|
|
|
celery: newrelic
|
|
- celery: pytest<7
|
|
{py3.7}-celery: importlib-metadata<5.0
|
|
|
|
# Chalice
|
|
--
|
|
2.47.0
|
|
|