From ac0ebbf7b0e869973e370a2c6df080d6994a71a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 13 Oct 2026 16:23:40 +0200 Subject: [PATCH 1/2] test(spanner): reuse shared database in session API system tests Reuse `shared_database` instead of creating and dropping a dedicated database in `test_session_api.py`. Previously, `sessions_database` provisioned a separate Spanner database with all 20 schema tables and protobuf descriptors, duplicating what `shared_database` already provides in `conftest.py`. Changes: - Refactor the `sessions_database` fixture to wrap and return `shared_database`. - Pre-warm a session in the pool so OpenTelemetry span tests expecting `session_found=True` continue to pass. - Eliminate redundant database creation, DDL execution, and teardown drop calls, saving ~1 minute in standard CI. --- .../tests/system/test_session_api.py | 38 ++----------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/packages/google-cloud-spanner/tests/system/test_session_api.py b/packages/google-cloud-spanner/tests/system/test_session_api.py index b916f3cc5283..7b8f89221d17 100644 --- a/packages/google-cloud-spanner/tests/system/test_session_api.py +++ b/packages/google-cloud-spanner/tests/system/test_session_api.py @@ -263,45 +263,13 @@ @pytest.fixture(scope="session") -def sessions_database( - shared_instance, database_operation_timeout, database_dialect, proto_descriptor_file -): - database_name = _helpers.unique_id("test_sessions", separator="_") - pool = spanner_v1.BurstyPool(labels={"testcase": "session_api"}) - - if database_dialect == DatabaseDialect.POSTGRESQL: - sessions_database = shared_instance.database( - database_name, - pool=pool, - database_dialect=database_dialect, - ) - - operation = sessions_database.create() - operation.result(database_operation_timeout) - - operation = sessions_database.update_ddl(ddl_statements=_helpers.DDL_STATEMENTS) - operation.result(database_operation_timeout) - - else: - sessions_database = shared_instance.database( - database_name, - ddl_statements=_helpers.DDL_STATEMENTS, - pool=pool, - proto_descriptors=proto_descriptor_file, - ) - - operation = sessions_database.create() - operation.result(database_operation_timeout) - - _helpers.retry_has_all_dll(sessions_database.reload)() +def sessions_database(shared_database): # Some tests expect there to be a session present in the pool. # Experimental host connections only support multiplexed sessions if not _helpers.USE_SPANNER_OMNI: - pool.put(pool.get()) - - yield sessions_database + shared_database._pool.put(shared_database._pool.get()) - sessions_database.drop() + return shared_database @pytest.fixture(scope="function") From 56200681fd47dc7c686704cf7b5bbab3a85cd846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 14 Oct 2026 10:34:54 +0200 Subject: [PATCH 2/2] fix(spanner): get a separate DatabaseClient for session tests --- .../tests/system/test_session_api.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/google-cloud-spanner/tests/system/test_session_api.py b/packages/google-cloud-spanner/tests/system/test_session_api.py index 7b8f89221d17..c84835810cfd 100644 --- a/packages/google-cloud-spanner/tests/system/test_session_api.py +++ b/packages/google-cloud-spanner/tests/system/test_session_api.py @@ -263,13 +263,20 @@ @pytest.fixture(scope="session") -def sessions_database(shared_database): +def sessions_database(shared_instance, shared_database): + pool = spanner_v1.BurstyPool(labels={"testcase": "session_api"}) + database = shared_instance.database( + shared_database.database_id, + pool=pool, + database_dialect=shared_database.database_dialect, + proto_descriptors=getattr(shared_database, "_proto_descriptors", None), + ) # Some tests expect there to be a session present in the pool. # Experimental host connections only support multiplexed sessions if not _helpers.USE_SPANNER_OMNI: - shared_database._pool.put(shared_database._pool.get()) + pool.put(pool.get()) - return shared_database + return database @pytest.fixture(scope="function")