From d6cf45b9fea88f932e96e88e8a7608d05c84b09f Mon Sep 17 00:00:00 2001
From: Mohammad Torkashvand <mohammad.torkashvand@geant.org>
Date: Sat, 19 Oct 2024 11:07:38 +0200
Subject: [PATCH] Add pytest-xdist for parallel test execution
---
.gitignore | 2 +-
.gitlab-ci.yml | 2 +-
requirements.txt | 1 +
test/conftest.py | 12 +++++++++---
tox.ini | 14 +++++---------
5 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/.gitignore b/.gitignore
index 5dbfe3a1a..6afde9852 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
__pycache__/
*.egg-info
-.coverage
+.coverage*
coverage.xml
.vscode
venv
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0ed900004..16f7d01ea 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -23,7 +23,7 @@ run-tox-pipeline:
POSTGRES_DB: gso-test-db
POSTGRES_USER: nwa
POSTGRES_PASSWORD: nwa
- DATABASE_URI_TEST: 'postgresql://nwa:nwa@postgres:5432/gso-test-db'
+ DATABASE_HOST: "postgres"
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
diff --git a/requirements.txt b/requirements.txt
index 621780cce..52ed7721d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -23,3 +23,4 @@ sphinx-rtd-theme==2.0.0
urllib3_mock==0.3.3
pytest-asyncio==0.23.6
pre-commit~=3.7.0
+pytest-xdist==3.6.1
\ No newline at end of file
diff --git a/test/conftest.py b/test/conftest.py
index 2eb7e6a28..ea7652070 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -142,8 +142,14 @@ def data_config_filename() -> str:
@pytest.fixture(scope="session")
def db_uri():
- """Provide the database uri configuration to run the migration on."""
- return os.environ.get("DATABASE_URI_TEST", "postgresql://nwa:nwa@localhost/gso-test-db")
+ """Provide a unique database URI for each pytest-xdist worker, or a default URI if running without xdist."""
+ worker_id = os.getenv("PYTEST_XDIST_WORKER")
+ database_host = os.getenv("DATABASE_HOST", "localhost")
+
+ if worker_id:
+ return f"postgresql://nwa:nwa@{database_host}/gso-test-db_{worker_id}"
+
+ return os.environ.get("DATABASE_URI_TEST", f"postgresql://nwa:nwa@{database_host}/gso-test-db")
def run_migrations(db_uri: str) -> None:
@@ -281,7 +287,7 @@ def partner_factory():
return _create_partner
-@pytest.fixture(scope="session")
+@pytest.fixture()
def geant_partner(partner_factory):
return partner_factory(name="GEANT-TEST", email="goat-test@geant.org")
diff --git a/tox.ini b/tox.ini
index a8eab7b2f..89a3dc2b7 100644
--- a/tox.ini
+++ b/tox.ini
@@ -6,25 +6,21 @@ markers = "workflow,noautofixt"
filterwarnings = "ignore,default:::gso"
[testenv]
-passenv = DATABASE_URI_TEST,SKIP_ALL_TESTS,ENVIRONMENT_IGNORE_MUTATION_DISABLED
+passenv = DATABASE_URI_TEST,DATABASE_HOST,SKIP_ALL_TESTS,ENVIRONMENT_IGNORE_MUTATION_DISABLED
setenv =
- OAUTH2_ACTIVE = False
- TRANSLATIONS_DIR = ./gso/translations
+ OAUTH2_ACTIVE=False
+ TRANSLATIONS_DIR=./gso/translations
TESTING=true
EXECUTOR=threadpool
deps =
- coverage
+ pytest-cov
-r requirements.txt
commands =
ruff check --respect-gitignore --preview .
ruff format --respect-gitignore --preview --check .
mypy .
- coverage erase
- coverage run --source gso --omit="gso/migrations/*" -m pytest {posargs}
- coverage xml
- coverage html
- sh -c "if [ $SKIP_ALL_TESTS -eq 1 ]; then echo 'Skipping coverage report'; else coverage report --fail-under 80; fi"
+ sh -c "if [ $SKIP_ALL_TESTS -eq 1 ]; then echo 'Skipping coverage report'; else pytest --cov=gso --cov-report=xml --cov-report=html --cov-fail-under=85 -n auto {posargs}; fi"
allowlist_externals =
sh
--
GitLab