58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
|
# Copyright (c) 2023-2024 Arista Networks, Inc.
|
||
|
# Use of this source code is governed by the Apache License 2.0
|
||
|
# that can be found in the LICENSE file.
|
||
|
"""Fixtures for benchmarking ANTA."""
|
||
|
|
||
|
import logging
|
||
|
|
||
|
import pytest
|
||
|
import respx
|
||
|
from _pytest.terminal import TerminalReporter
|
||
|
|
||
|
from anta.catalog import AntaCatalog
|
||
|
|
||
|
from .utils import AntaMockEnvironment
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
TEST_CASE_COUNT = None
|
||
|
|
||
|
|
||
|
@pytest.fixture(name="anta_mock_env", scope="session") # We want this fixture to have a scope set to session to avoid reparsing all the unit tests data.
|
||
|
def anta_mock_env_fixture() -> AntaMockEnvironment:
|
||
|
"""Return an AntaMockEnvironment for this test session. Also configure respx to mock eAPI responses."""
|
||
|
global TEST_CASE_COUNT # noqa: PLW0603
|
||
|
eapi_route = respx.post(path="/command-api", headers={"Content-Type": "application/json-rpc"})
|
||
|
env = AntaMockEnvironment()
|
||
|
TEST_CASE_COUNT = env.tests_count
|
||
|
eapi_route.side_effect = env.eapi_response
|
||
|
return env
|
||
|
|
||
|
|
||
|
@pytest.fixture # This fixture should have a scope set to function as the indexing result is stored in this object
|
||
|
def catalog(anta_mock_env: AntaMockEnvironment) -> AntaCatalog:
|
||
|
"""Fixture that return an ANTA catalog from the AntaMockEnvironment of this test session."""
|
||
|
return anta_mock_env.catalog
|
||
|
|
||
|
|
||
|
def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None:
|
||
|
"""Display the total number of ANTA unit test cases used to benchmark."""
|
||
|
terminalreporter.write_sep("=", f"{TEST_CASE_COUNT} ANTA test cases")
|
||
|
|
||
|
|
||
|
def pytest_generate_tests(metafunc: pytest.Metafunc) -> None:
|
||
|
"""Parametrize inventory for benchmark tests."""
|
||
|
if "inventory" in metafunc.fixturenames:
|
||
|
for marker in metafunc.definition.iter_markers(name="parametrize"):
|
||
|
if "inventory" in marker.args[0]:
|
||
|
# Do not override test function parametrize marker for inventory arg
|
||
|
return
|
||
|
metafunc.parametrize(
|
||
|
"inventory",
|
||
|
[
|
||
|
pytest.param({"count": 1, "disable_cache": True, "reachable": True}, id="1-device"),
|
||
|
pytest.param({"count": 2, "disable_cache": True, "reachable": True}, id="2-devices"),
|
||
|
],
|
||
|
indirect=True,
|
||
|
)
|