Skip to content
Open
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 71 additions & 17 deletions src/pytest_codspeed/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
import json
import os
import random
from collections.abc import AsyncIterator
from contextlib import contextmanager
from dataclasses import dataclass, field
from inspect import isawaitable
from pathlib import Path
from time import time
from typing import TYPE_CHECKING, cast
from typing import TYPE_CHECKING, cast, overload

import pytest
from _pytest.fixtures import FixtureManager
Expand Down Expand Up @@ -232,35 +235,86 @@ def pytest_collection_modifyitems(
items[:] = selected


def _measure(
plugin: CodSpeedPlugin,
node: pytest.Item,
config: pytest.Config,
pedantic_options: PedanticOptions | None,
fn: Callable[..., T],
args: tuple[Any, ...],
kwargs: dict[str, Any],
) -> T:
@contextmanager
def _measure_context(node: pytest.Item) -> AsyncIterator[None]
marker_options = BenchmarkMarkerOptions.from_pytest_item(node)
random.seed(0)
is_gc_enabled = gc.isenabled()
if is_gc_enabled:
gc.collect()
gc.disable()

try:
uri, name = get_git_relative_uri_and_name(node.nodeid, config.rootpath)
yield
finally:
# Ensure GC is re-enabled even if the test failed
if is_gc_enabled:
gc.enable()


async def _async_measure(
plugin: CodSpeedPlugin,
node: pytest.Item,
pedantic_options: PedanticOptions | None,
fn: Awaitable[T],
args: tuple[Any, ...],
kwargs: dict[str, Any],
) -> T:
with _measure_context(node):
if pedantic_options is None:
return plugin.instrument.measure(
return await plugin.instrument.measure_async(
marker_options, name, uri, fn, *args, **kwargs
)
else:
return plugin.instrument.measure_pedantic(
return await plugin.instrument.measure_pedantic_async(
marker_options, pedantic_options, name, uri
)
finally:
# Ensure GC is re-enabled even if the test failed
if is_gc_enabled:
gc.enable()


@overload
def _measure(
plugin: CodSpeedPlugin,
node: pytest.Item,
config: pytest.Config,
pedantic_options: PedanticOptions | None,
fn: Awaitable[T],
Comment thread
Dreamsorcerer marked this conversation as resolved.
Outdated
args: tuple[Any, ...],
kwargs: dict[str, Any],
) -> Awaitable[T]:
...
@overload
def _measure(
plugin: CodSpeedPlugin,
node: pytest.Item,
config: pytest.Config,
pedantic_options: PedanticOptions | None,
fn: Callable[..., T],
args: tuple[Any, ...],
kwargs: dict[str, Any],
) -> T:
...
def _measure(
plugin: CodSpeedPlugin,
node: pytest.Item,
config: pytest.Config,
pedantic_options: PedanticOptions | None,
fn: Callable[..., T] | Awaitable[T],
args: tuple[Any, ...],
kwargs: dict[str, Any],
) -> T | Awaitable[T]:
uri, name = get_git_relative_uri_and_name(node.nodeid, config.rootpath)
if isawaitable(fn):
return _async_measure(plugin, node, pedantic_options, fn, args, kwargs)
else:
with _measure_context(node):
if pedantic_options is None:
return plugin.instrument.measure(
marker_options, name, uri, fn, *args, **kwargs
)
else:
return plugin.instrument.measure_pedantic(
marker_options, pedantic_options, name, uri
)


def wrap_runtest(
Expand Down
Loading