Skip to content

Audit test

audit_test

MCP tool for structured test execution.

AuditTestTool

Bases: AXMTool

Run tests with structured output.

Registered as audit_test via axm.tools entry point.

Source code in packages/axm-audit/src/axm_audit/tools/audit_test.py
Python
class AuditTestTool(AXMTool):
    """Run tests with structured output.

    Registered as ``audit_test`` via axm.tools entry point.
    """

    expose_directly = True
    domain = "audit"
    tags = frozenset({"test", "pytest", "coverage"})

    @property
    def name(self) -> str:
        """Return tool name for registry lookup."""
        return "audit_test"

    def execute(  # noqa: PLR0913
        self,
        *,
        path: str = ".",
        mode: str = "failures",
        files: list[str] | None = None,
        markers: list[str] | None = None,
        stop_on_first: bool = True,
        include_cases: bool = False,
        **kwargs: object,
    ) -> ToolResult:
        """Run tests with structured output.

        Args:
            path: Path to project root.
            mode: ``"cases"`` requests lossless per-item evidence through the
                historical field; other values remain backward-compatible.
            files: Specific test files to run.
            markers: Pytest markers to filter.
            stop_on_first: Stop on first failure.
            include_cases: Include lossless per-item pytest verdicts.

        Returns:
            ToolResult with structured test report.
        """
        include_case_evidence = include_cases or mode == "cases"
        if mode not in {"failures", "cases"}:
            logger.info("mode param is deprecated")

        try:
            project_path = Path(path).resolve()
            if not project_path.is_dir():
                return ToolResult(
                    success=False, error=f"Not a directory: {project_path}"
                )

            from axm_audit.core.test_runner import run_tests

            report = run_tests(
                project_path,
                files=files,
                markers=markers,
                stop_on_first=stop_on_first,
                include_cases=include_case_evidence,
            )

            data = dataclasses.asdict(report)
            if include_case_evidence:
                data["cases"] = [dataclasses.asdict(case) for case in report.cases]
            else:
                data.pop("cases", None)

            from axm_audit.tools.audit_test_text import format_audit_test_text

            text = format_audit_test_text(report)

            return ToolResult(success=_tool_succeeded(report), data=data, text=text)
        except Exception as exc:  # noqa: BLE001
            return ToolResult(success=False, error=str(exc))
name property

Return tool name for registry lookup.

execute(*, path='.', mode='failures', files=None, markers=None, stop_on_first=True, include_cases=False, **kwargs)

Run tests with structured output.

Parameters:

Name Type Description Default
path str

Path to project root.

'.'
mode str

"cases" requests lossless per-item evidence through the historical field; other values remain backward-compatible.

'failures'
files list[str] | None

Specific test files to run.

None
markers list[str] | None

Pytest markers to filter.

None
stop_on_first bool

Stop on first failure.

True
include_cases bool

Include lossless per-item pytest verdicts.

False

Returns:

Type Description
ToolResult

ToolResult with structured test report.

Source code in packages/axm-audit/src/axm_audit/tools/audit_test.py
Python
def execute(  # noqa: PLR0913
    self,
    *,
    path: str = ".",
    mode: str = "failures",
    files: list[str] | None = None,
    markers: list[str] | None = None,
    stop_on_first: bool = True,
    include_cases: bool = False,
    **kwargs: object,
) -> ToolResult:
    """Run tests with structured output.

    Args:
        path: Path to project root.
        mode: ``"cases"`` requests lossless per-item evidence through the
            historical field; other values remain backward-compatible.
        files: Specific test files to run.
        markers: Pytest markers to filter.
        stop_on_first: Stop on first failure.
        include_cases: Include lossless per-item pytest verdicts.

    Returns:
        ToolResult with structured test report.
    """
    include_case_evidence = include_cases or mode == "cases"
    if mode not in {"failures", "cases"}:
        logger.info("mode param is deprecated")

    try:
        project_path = Path(path).resolve()
        if not project_path.is_dir():
            return ToolResult(
                success=False, error=f"Not a directory: {project_path}"
            )

        from axm_audit.core.test_runner import run_tests

        report = run_tests(
            project_path,
            files=files,
            markers=markers,
            stop_on_first=stop_on_first,
            include_cases=include_case_evidence,
        )

        data = dataclasses.asdict(report)
        if include_case_evidence:
            data["cases"] = [dataclasses.asdict(case) for case in report.cases]
        else:
            data.pop("cases", None)

        from axm_audit.tools.audit_test_text import format_audit_test_text

        text = format_audit_test_text(report)

        return ToolResult(success=_tool_succeeded(report), data=data, text=text)
    except Exception as exc:  # noqa: BLE001
        return ToolResult(success=False, error=str(exc))