b2b8aca7c6
- Remove --profiling-output arg from runner.yaml (plugin uses default path)
- Inline profiling hooks in root conftest.py with graceful fallback
- Replace mc-based bucket-init with Python urllib (no proxy interference)
- Add explicit ProxyHandler({}) to guarantee no proxy usage in bucket-init
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
"""Pytest plugin for integration test profiling.
|
|
|
|
Adds a ``--profiling-output`` CLI option and hooks into the pytest session
|
|
lifecycle to collect endpoint timing data via :class:`EndpointProfiler` and
|
|
write a JSON report at the end of the run.
|
|
|
|
The plugin is automatically loaded by pytest because it lives in the
|
|
``tests/integration/`` directory alongside ``conftest.py``. It registers
|
|
a session-scoped ``profiler`` fixture that other fixtures (e.g. the
|
|
profiled HTTP clients in conftest.py) can depend on.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from tests.integration.profiler import EndpointProfiler
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# CLI option — registered by root conftest.py to ensure availability
|
|
# ---------------------------------------------------------------------------
|
|
|
|
DEFAULT_PROFILING_OUTPUT = "/tmp/profiling-report.json"
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Session-scoped profiler instance (shared across all tests)
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Module-level reference so the session hooks can access it without fixtures.
|
|
_profiler: EndpointProfiler | None = None
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def profiler() -> EndpointProfiler:
|
|
"""Session-scoped :class:`EndpointProfiler` instance.
|
|
|
|
Collects timing data across all integration tests. The summary is
|
|
printed and written to disk by the ``pytest_sessionfinish`` and
|
|
``pytest_terminal_summary`` hooks below.
|
|
"""
|
|
global _profiler # noqa: PLW0603
|
|
_profiler = EndpointProfiler()
|
|
return _profiler
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Session hooks — write report + print summary
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def pytest_sessionfinish(session: pytest.Session, exitstatus: int) -> None:
|
|
"""Write the profiling JSON report after all tests complete."""
|
|
if _profiler is None:
|
|
return
|
|
|
|
output_path = session.config.getoption("profiling_output", DEFAULT_PROFILING_OUTPUT)
|
|
try:
|
|
_profiler.write_json(output_path)
|
|
except OSError:
|
|
# Best-effort — don't fail the session if we can't write the report
|
|
pass
|
|
|
|
|
|
def pytest_terminal_summary(
|
|
terminalreporter: pytest.TerminalReporter,
|
|
exitstatus: int,
|
|
config: pytest.Config,
|
|
) -> None:
|
|
"""Print the profiling summary table at the end of the test session."""
|
|
if _profiler is None:
|
|
return
|
|
|
|
output_path = config.getoption("profiling_output", DEFAULT_PROFILING_OUTPUT)
|
|
|
|
terminalreporter.section("Profiling Summary")
|
|
_profiler.print_summary()
|
|
terminalreporter.write_line(f"JSON report written to: {output_path}")
|