From 8b647e340567ab0817aad3e1073553d4bce02f48 Mon Sep 17 00:00:00 2001 From: Roman Postnov <59239573+dikos1337@users.noreply.github.com> Date: Sat, 23 May 2026 18:32:48 +0300 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Speed=20up=20test=20suite?= =?UTF-8?q?=20via=20caching=20and=20fixture=20scopes=20to=20make=20it=20~2?= =?UTF-8?q?4%=20faster=20(#13583)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- .../test_security/test_tutorial005.py | 16 ++++++++++++++++ .../test_sql_databases/test_tutorial001.py | 3 +++ .../test_sql_databases/test_tutorial002.py | 3 +++ 3 files changed, 22 insertions(+) diff --git a/tests/test_tutorial/test_security/test_tutorial005.py b/tests/test_tutorial/test_security/test_tutorial005.py index c6e0e78e09..0d25a1d241 100644 --- a/tests/test_tutorial/test_security/test_tutorial005.py +++ b/tests/test_tutorial/test_security/test_tutorial005.py @@ -1,4 +1,5 @@ import importlib +from functools import lru_cache from types import ModuleType import pytest @@ -14,6 +15,7 @@ from ...utils import needs_py310 pytest.param("tutorial005_py310", marks=needs_py310), pytest.param("tutorial005_an_py310", marks=needs_py310), ], + scope="module", ) def get_mod(request: pytest.FixtureRequest): mod = importlib.import_module(f"docs_src.security.{request.param}") @@ -21,6 +23,20 @@ def get_mod(request: pytest.FixtureRequest): return mod +@pytest.fixture(scope="module", autouse=True) +def cache_verify_password(mod: ModuleType): + assert hasattr(mod, "verify_password"), ( + f"Module {mod.__name__} does not have attribute 'verify_password'" + ) + + original_func = mod.verify_password + cached_func = lru_cache()(original_func) + + mod.verify_password = cached_func + yield + mod.verify_password = original_func + + def get_access_token( *, username="johndoe", password="secret", scope=None, client: TestClient ): diff --git a/tests/test_tutorial/test_sql_databases/test_tutorial001.py b/tests/test_tutorial/test_sql_databases/test_tutorial001.py index 3407ec7588..cd6b3b11cf 100644 --- a/tests/test_tutorial/test_sql_databases/test_tutorial001.py +++ b/tests/test_tutorial/test_sql_databases/test_tutorial001.py @@ -25,6 +25,7 @@ def clear_sqlmodel(): pytest.param("tutorial001_py310", marks=needs_py310), pytest.param("tutorial001_an_py310", marks=needs_py310), ], + scope="module", ) def get_client(request: pytest.FixtureRequest): clear_sqlmodel() @@ -44,6 +45,8 @@ def get_client(request: pytest.FixtureRequest): # Clean up connection explicitly to avoid resource warning mod.engine.dispose() + mod.engine.dispose() + def test_crud_app(client: TestClient): # TODO: this warns that SQLModel.from_orm is deprecated in Pydantic v1, refactor diff --git a/tests/test_tutorial/test_sql_databases/test_tutorial002.py b/tests/test_tutorial/test_sql_databases/test_tutorial002.py index 51a36b6c79..8037d886fb 100644 --- a/tests/test_tutorial/test_sql_databases/test_tutorial002.py +++ b/tests/test_tutorial/test_sql_databases/test_tutorial002.py @@ -25,6 +25,7 @@ def clear_sqlmodel(): pytest.param("tutorial002_py310", marks=needs_py310), pytest.param("tutorial002_an_py310", marks=needs_py310), ], + scope="module", ) def get_client(request: pytest.FixtureRequest): clear_sqlmodel() @@ -44,6 +45,8 @@ def get_client(request: pytest.FixtureRequest): # Clean up connection explicitly to avoid resource warning mod.engine.dispose() + mod.engine.dispose() + def test_crud_app(client: TestClient): # TODO: this warns that SQLModel.from_orm is deprecated in Pydantic v1, refactor