Files
core/benchmarks/conftest.py
T

46 lines
1.5 KiB
Python

"""Shared fixtures for the CodSpeed benchmark suite.
These benchmarks live outside ``tests`` on purpose: ``testpaths`` only points at
``tests``, so the regular suite never collects them. CodSpeed runs them with
``pytest benchmarks --codspeed`` and tracks the results per pull request.
"""
from collections.abc import AsyncGenerator, Callable
import pytest
from homeassistant.core import HomeAssistant
from tests.common import async_test_home_assistant
@pytest.fixture
async def hass() -> AsyncGenerator[HomeAssistant]:
"""Return a running Home Assistant instance for benchmarking.
Most hot paths under test (``async_fire``, ``async_set``, ``async_render``)
are ``@callback`` methods, so the benchmark fixture can drive them
synchronously from within the running loop.
"""
async with async_test_home_assistant() as hass:
yield hass
@pytest.fixture
def populate_states(hass: HomeAssistant) -> Callable[[int], None]:
"""Return a helper that fills the state machine with ``count`` sensors.
Used by the scaling benchmarks to measure a path at several sizes, so an
algorithmic regression shows up as the curve bending instead of hiding
behind a single constant-factor number.
"""
def _populate(count: int) -> None:
for index in range(count):
hass.states.async_set(
f"sensor.bench_{index}",
str(index),
{"friendly_name": f"Bench {index}", "unit_of_measurement": "W"},
)
return _populate