2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

Support both pytest and legacy system test runner

The legacy system test framework uses pytest to execute some tests.
Since it'd be quite difficult to convince pytest to decide whether to
include conftest.py (or which ones to include when launching from
subdir), it makes more sense to have a shared conftest.py which is used
by both the legacy test runner invocations of pytest and the new pytest
system test runner. It is ugly, but once we drop support for the legacy
runner, we'll get rid of it.

Properly scope the *port fixtures in order to ensure they'll work as
expected with the new pytest runner. Instead of using "session" (which
means the fixture is only evaluated once for the entire execution of
pytest), use "module" scope, which is evaluated separately for each
module. The legacy runner invoked pytest for each system test
separately, while the new pytest runner is invoked once for all system
tests -- therefore it requires the more fine-grained "module" scope to
for the fixtures to work properly.

Remove python shebang, as conftest.py isn't supposed to be an executable
script.
This commit is contained in:
Tom Krizek
2023-01-12 15:48:55 +01:00
parent 845fa7a849
commit 30cb9b7e28
2 changed files with 24 additions and 8 deletions

View File

@@ -1,5 +1,3 @@
#!/usr/bin/python3
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
@@ -12,25 +10,43 @@
# information regarding copyright ownership.
import os
import pytest
@pytest.fixture(scope="session")
# ======================= LEGACY=COMPATIBLE FIXTURES =========================
# The following fixtures are designed to work with both pytest system test
# runner and the legacy system test framework.
@pytest.fixture(scope="module")
def named_port():
return int(os.environ.get("PORT", default=5300))
@pytest.fixture(scope="session")
@pytest.fixture(scope="module")
def named_tlsport():
return int(os.environ.get("TLSPORT", default=8853))
@pytest.fixture(scope="session")
@pytest.fixture(scope="module")
def named_httpsport():
return int(os.environ.get("HTTPSPORT", default=4443))
@pytest.fixture(scope="session")
@pytest.fixture(scope="module")
def control_port():
return int(os.environ.get("CONTROLPORT", default=9953))
# ======================= PYTEST SYSTEM TEST RUNNER ==========================
# From this point onward, any setting, fixtures or functions only apply to the
# new pytest runner. Ideally, these would be in a separate file. However, due
# to how pytest works and how it's used by the legacy runner, the best approach
# is to have everything in this file to avoid duplication and set the
# LEGACY_TEST_RUNNER if pytest is executed from the legacy framework.
#
# FUTURE: Once legacy runner is no longer supported, remove the env var and
# don't branch the code.
if os.getenv("LEGACY_TEST_RUNNER", "0") == "0":
pass # will be implemented in followup commits