test-trust
test-trust
Сообщает ИИ-агентам для программирования (Claude Code, Codex, OpenHands, Cursor или локальной модели — агностичен по отношению к агенту, через MCP, Model Context Protocol) не только то, какие тесты покрывают изменение, но и можно ли этим тестам на самом деле доверять в том, что они поймают регрессию в этом месте.
«CI зелёный» и «это изменение безопасно» сегодня каждый агент считает одним и тем же. Но это не так. Тест, покрывающий функцию, — не то же самое, что тест, который действительно упал бы, если бы эта функция сломалась: тесты с избыточным количеством моков, снэпшот-тесты, которые просто перезаписывают любой новый вывод, и тесты без утверждений — все показывают зелёный цвет, ничего при этом не выявляя.
Как это работает
Мутационное тестирование (обёртка над зрелыми существующими движками, а не собственная реализация — mutmut для Python, StrykerJS для JS/TS, gremlins для Go, cargo-mutants для Rust): намеренно вносит небольшие баги в изменённый код и проверяет, действительно ли покрывающие тесты падают. Выбор тестов для каждого мутанта берётся из собственных данных о покрытии каждого движка, а не реализуется здесь заново — mutmut и Stryker (где есть поддерживаемый раннер: jest/mocha/vitest) выбирают только те конкретные тесты, которые покрывают каждый мутант; gremlins и cargo-mutants пропускают мутантов с нулевым покрытием, но перезапускают полный релевантный набор тестов для каждого мутанта, у которого покрытие есть, — механизм более грубый (и более медленный на больших репозиториях), но по-прежнему корректный.
Скоупинг по диффу (наш): сопоставляет изменённые строки git-диффа с охватывающей их функцией через собственный парсинг каждого языка, так что и мутационный прогон, и оценка доверия ограничены тем, что действительно изменилось, а не целым файлом или репозиторием.
Слияние (новая часть, нигде больше не реализованная, — проверено): объединяет вышеперечисленное в единую оценку доверия для каждой изменённой функции, представленную как MCP-инструмент, который любой агент может вызвать, прежде чем считать зелёный прогон тестов доказательством безопасности.
См. examples/weak-test-fixture/ (Python), examples/weak-test-fixture-js/ (JS), examples/weak-test-fixture-go/ (Go), examples/weak-test-fixture-rust/ (Rust), examples/plug-and-play-fixture/ (вообще без конфигурации) и examples/multi-file-fixture-js/ (функция, которая импортирует соседний модуль, что доказывает: мутационный скоупинг не ломает кросс-файловые импорты) — это рабочие, живые демонстрации: функция, покрытая тестом, который сегодня проходит, но не поймал бы реальный баг.
Related MCP server: sumo-qa
Проверено на реальных репозиториях, а не только на фикстурах
Каждая фикстура выше — игрушка. Прежде чем довериться концепции, инструмент также запускался без конфигурации на реальных, внешних, неизменённых репозиториях на всех четырёх языках: psf/requests (Python, оценены 37 реальных функций, например resolve_proxies корректно помечена с доверием 0.0 — на неё действительно не ссылается ни один тест), kind-of (JS, ~50M еженедельных загрузок, isArray и isRegexp помечены, несмотря на прохождение всех 36 тестов), dustin/go-humanize (Go) и chronotope/humantime (Rust, настоящий многомодульный крейт — подтверждает, что мутационный скоупинг не ломается на реальном кросс-модульном коде, а не только на нашей собственной фикстуре). Этот процесс выявил и исправил несколько реальных багов в трёх из четырёх — включая один, где неудачный мутационный прогон молча сообщался как ложная оценка доверия в 100%, и баг масштабирования, где запрос, ограниченный одним файлом, молча мутировал вместо этого целый реальный пакет. Проверка реального репозитория Rust не выявила нового бага, что согласуется с тем, что cargo-mutants -f — самый чистый и наиболее прямо поддерживаемый механизм скоупинга из четырёх. Полное описание см. в docs/architecture.md.
Внешние инструменты, которые он оборачивает (установите один раз, для каждого используемого языка)
Python:
mutmut— устанавливается автоматически как зависимость этого проекта.JS/TS:
@stryker-mutator/core— загружается автоматически черезnpxпри первом использовании.Go:
gremlins—go install github.com/go-gremlins/gremlins/cmd/gremlins@latestRust:
cargo-mutants—cargo install cargo-mutants
Попробуйте
Ещё не опубликован на PyPI. Все команды ниже предполагают локальный клон этого репозитория и запуск изнутри него (uv run --directory <path> ... — снаружи, как в примере встраивания в агента ниже). После публикации всё это сводится к обычному pip install test-trust / uvx test-trust, запускаемому откуда угодно, — без клона, без запоминания пути, без uv run --directory. Это единственное изменение — последний шаг между «работает, но с настройкой» и «по-настоящему легко внедрить»; в поведении инструмента не меняется ничего, меняется только способ его получения.
Требуются Python 3.11+ и uv. Мутационные движки для отдельных языков (см. выше) нужны только для языков, которые вы действительно используете, — примеру на Python ниже не требуется ничего, кроме uv sync.
uv sync
uv run test-trust check examples/plug-and-play-fixture inventory.pyНикакого файла настройки, никакого ручного запуска мутационного тестирования: эта одна команда сама определяет язык, сама записывает конфигурацию, сама запускает ограниченное этим файлом мутационное тестирование, используя реальную команду тестирования самого репозитория, и выводит оценку доверия.
Чтобы запустить для другого файла или репозитория:
uv run test-trust check <path-to-repo> <source-file> [--changed-file F] [--base-ref REF] [--threshold T]Изменение порога (по умолчанию 0.5) — что считается достаточно протестированным. Повысьте его (например, 0.8), чтобы помечать всё, что не дотягивает до почти полного мутационного покрытия; понизьте, чтобы помечать лишь самые серьёзные пробелы. Тот же параметр, три интерфейса:
CLI:
--threshold 0.8, как показано выше.MCP-инструмент:
threshold— аргументget_test_trust, например,get_test_trust(repo_path=..., source_file=..., threshold=0.8). Вы не вызываете его сами — это делает агент, — поэтому задать его означает указать агенту (в вашем промпте или как постоянную инструкцию вCLAUDE.md: «вызови get_test_trust с threshold=0.8»). Если параметр не задан, используется0.5.GitHub Action: входной параметр
low-trust-thresholdв вашем файле рабочего процесса:- uses: ./.github/actions/test-trust-pr with: github-token: ${{ secrets.GITHUB_TOKEN }} low-trust-threshold: "0.8"
Встраивание в агента
Одноразовая настройка, регистрируемая глобально, а не для каждого проекта: поскольку repo_path является параметром каждого вызова, а не фиксируется при запуске, одной регистрации хватает для всех проектов, которые вы откроете впоследствии, а не только для того, в котором она была выполнена. Для Claude Code добавьте в ~/.claude.json (на уровне пользователя, а не в .mcp.json проекта):
{
"mcpServers": {
"test-trust": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/test-trust", "test-trust", "mcp"]
}
}
}Та же форма command/args работает для Codex, Cursor и любого другого MCP-клиента — по этим клиентам и по тому, что изменится после публикации на PyPI, см. docs/embedding.md (uvx test-trust mcp — локальный путь вообще не нужен).
После этого инструмент незаметен в повседневной работе: агент сам вызывает get_test_trust по ходу задачи, так же, как уже вызывает свои инструменты чтения файлов или bash, — вы не вызываете его напрямую.
Или запускайте его на каждом PR — агент не нужен
.github/actions/test-trust-pr оценивает каждый изменённый поддерживаемый файл в PR и публикует (или обновляет при последующих пушах) один комментарий — помечает любую функцию, существующие тесты которой на самом деле не поймали бы регрессию в этом месте. Это полезно любой команде, занимающейся ревью кода, независимо от того, использует ли кто-то ИИ-агента. .github/workflows/test-trust.yml — рабочий пример; проверен от начала до конца (обнаружение диффа, оценка, оба варианта отображения комментария — «всё чисто» и «с флагами») на реальных коммитах в реальном репозитории — не проверен только сам живой вызов GitHub API, поскольку для проверки нужен настоящий PR.
Разработка
uv sync
uv run pytest tests/ # this project's own unit test suite
uv run test-trust check <repo> <file> # exercise it against real codetests/ покрывает детерминированную логику (скоупинг по диффу, агрегацию оценки доверия, автоопределение языка, адаптер отчётов каждого мутационного движка) специально подготовленными фикстурами — быстро, без внешних инструментов мутационного тестирования, и именно этот набор реально выполняется в CI (.github/workflows/ci.yml). Он не заменяет описанную выше проверку на реальных репозиториях — это было ручное разовое упражнение, выполненное в ходе разработки (реальные внешние клоны, установленные реальные движки), а не то, что CI перезапускает при каждом пуше. Автоматизировать это стоит позже; пока не сделано.
Лицензия MIT.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityFmaintenanceMCP server for Codecov that provides tools to get commit coverage totals and prompts to suggest tests to write.1736ISC
- AlicenseAqualityAmaintenanceAn MCP server that brings senior-QA discipline to AI coding assistants, enabling test planning, TDD, mutation testing, and code review.485Apache 2.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server that performs automated code reviews by analyzing git diffs against configurable review standards with custom reviewer personas.2MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for test impact analysis and code intelligence. Maps tests to code and git history to determine impacted tests, risk scores, and ownership for AI coding agents.2MIT
Related MCP Connectors
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
Conformance checker for MCP servers. Free, no key, verdicts recomputable and re-measured daily.
A MCP server built for developers enabling Git based project management with project and personal…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rrudy9/test-trust'
If you have feedback or need assistance with the MCP directory API, please join our Discord server