关于 OrangePro
OrangePro 是面向开发者的本地测试分析工具,可将函数与测试证据关联、排列未受保护代码的优先级,并验证测试能否发现人为引入的故障。分析和排序无需 AI 模型;可选的测试生成使用用户提供的密钥。
主要功能
- 01关联函数与测试证据
- 02按风险排列测试缺口
- 03通过变异验证测试
- 04可选生成测试草稿
- 05生成 HTML 报告和 tests.csv
适用场景
- 01优先处理尚未验证的函数
- 02检查测试能否发现代码故障
- 03借助编码 Agent 查看测试缺口
- 04导出测试草稿供 QA 流程使用
MCP 相关
作为 MCP 服务,OrangePro 向编码 Agent 提供排序后的测试缺口、建议的测试位置和验证步骤。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @orangepro/mcp-serverOPENAI_API_KEY密钥Optional OpenAI BYOK key for AI candidate links and test generation.ANTHROPIC_API_KEY密钥Optional Anthropic BYOK key for AI candidate links and test generation.OLLAMA_BASE_URLOptional Ollama endpoint for local AI candidate links and test generation.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
18收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fresh | boolean | 否 | 即使自上次运行以来没有变化,也执行完整运行。默认情况下,未更改的代码仓库会立即返回 unchanged_since 和上次运行的报告。 |
| model | string | 否 | 覆盖模型名称。 |
| no_ai | boolean | 否 | 即使已配置提供方密钥,也禁用自动 AI 弱链接和候选流程处理。 |
| ai_all | boolean | 否 | 对所有确定性行为节点运行 AI 弱链接处理,而非仅处理缺口。 |
| source | string | 否 | 要分析的源路径。默认为工作区。 |
| base_ref | string | 否 | 可选的 PR/差异基准引用。默认情况下,尽可能自动检测 main/master。 |
| provider | enum | 否 | AI 流程的 BYOK 提供商覆盖项。openai | ollama | anthropic |
| workspace | string | 否 | 本地工作区根目录。默认为当前目录。 |
| no_ai_flows | boolean | 否 | 禁用自动 AI 候选流程发现,同时保留弱 AI 链接。 |
| prompt_version | enum | 否 | 自动证明生成通道的可选生成策略。默认为 v2/deterministic;v5 使用批量两阶段生成。无论选择哪种策略,证明/铸造门槛均不变。v2 | v5 |
| include_markdown | boolean | 否 | 丰富类似需求文档的 Markdown 文档。默认为 true。 |
| generate_coverage | boolean | 否 | 在 analyze 之前运行安全的本地覆盖率生成(如果支持)。默认为 false。 |
| coverage_timeout_ms | integer | 否 | 每条命令的覆盖率生成超时时间。 |
详细介绍
了解测试真正保护了哪些代码。故意破坏代码,证明这一点。
OrangePro 会映射代码库中的每个公共函数,将其与实际调用它的测试关联起来,并根据可能造成的破坏对剩余项排序。对于你关注的测试,它会在隔离副本中破坏函数,并检查测试是否失败。它在你的计算机上运行,不使用 AI 模型进行评分,也不会向 OrangePro 发送任何内容。只有在添加自己的密钥后,才会调用模型,以便可选地生成测试和提供建议。
npx -y @orangepro/mcp-server@latest start .
目录
你将获得什么
每次运行都会在 .orangepro/ 中生成两份报告和一份测试电子表格:
| 文件 | 面向对象 | 内容 |
|---|---|---|
short_behavior-coverage.html | 负责人、经理以及赶时间的人 | 一页内容:如何处理优先级最高的 20 个函数,排名前五的函数及其原因和为每个函数起草的测试,自上次报告以来的变化,以及如何重现此次运行。 |
behavior-coverage.html | 开发者 | **工作清单:**每个已排序函数及其处理建议、筛选器,还有一个侧边面板,展示证据、排序原因、两项起草的测试和证明命令。**映射:**按区域展示测试覆盖范围。**运行详情:**输入、计数、证明结果、指纹和设置。 |
tests.csv | QA、测试经理 | 每个测试槽位一行(前置条件、步骤、测试数据、预期结果、优先级、文件夹),可直接用于 Excel、Google Sheets、TestRail、Jira Xray 或 Zephyr Scale。详细报告中的 导出测试(CSV) 会下载此文件,其运行详情会说明各列的对应关系(导入 tests.csv)。 |
每个函数都会得到以下四种处理建议之一:
| 含义 | 处理方式 | |
|---|---|---|
| Done | 当此代码被破坏时,某项测试会失败。 | 无需处理。代码变更后,它会回到 Prove。 |
| Prove | 某项测试会运行此函数,或覆盖率运行会执行此函数,但尚未证明有测试能捕捉到代码破坏。 | 运行证明命令。 |
| Check | 某个测试文件或测试名称指向此处,但没有追踪到函数调用。 | 先阅读该测试文件;如果它会驱动此函数,就证明这一点,否则编写一项测试。 |
| Write | 目前还没有测试能捕捉到此处的代码破坏。 | 编写一项测试(为排名前 20 的函数起草了两项),然后证明它。 |
单页摘要
### 详细报告
这两份报告均由 OrangePro 在其自身仓库的提交 64a5213 上生成,未使用模型密钥,因此没有起草测试。使用密钥后,排名前 20 的每项都会显示两个起草的测试,侧边栏则会显示测试步骤和代码。
开发者为什么会用它
- 它会告诉你测试实际检查了什么,而不只是运行了什么。 调用某个函数的测试不一定是在检查该函数。
opro prove会在隔离副本中将函数体替换为固定返回值,然后原样重新运行你自己的测试。如果测试仍然通过,就说明它没有保护该函数。 - 它优先呈现影响。 一个筛选器会显示那些调用路径会到达删除或清除操作的代码(清除缓存不计入);其他筛选器会显示经常变更、有很多调用方或按计划运行的代码。
- 它如实呈现证据。 只有当测试调用了某个确切函数时,该函数才会被标记为“已关联”。名称相似的测试只是线索,绝不代表覆盖。只检查模拟对象的测试不计入。
- 它可重复运行。 相同的提交、完整的 git 历史、相同的配置和相同的版本会得到相同的排名。每份报告都会记录指纹,因此你能判断结果变化是由代码还是工具引起的。
- 你的编码 Agent 可以驱动它。 作为 MCP 服务,它能在一个循环中向 Claude Code、Cursor、Copilot、Codex 等工具提供按排名排列的缺口、建议的测试位置和证明步骤。
- 它免费、本地运行且开源(MIT)。 无需账户,分析无需 API 密钥,也不会上传任何内容。
快速开始
cd /path/to/your/repo
# install the repo's own dependencies first (npm ci, uv sync, go mod download, ...)
npx -y @orangepro/mcp-server@latest start .
open .orangepro/short_behavior-coverage.html
分析、排名和证明无需模型密钥。测试生成是可选功能,使用你自己的密钥(参见模型设置)。
想获得最准确的运行结果,请注意:
- 使用完整克隆,而不是浅克隆。 变更历史会影响部分排名;如果历史不完整,报告会注明。
- 使用
rank_exclude_paths排除非产品代码(参见配置)。 - 变更后重新运行。 每份报告都会说明自上一份报告以来发生的变更。如果没有任何变化(提交、文件、设置、覆盖和证明都相同),
start会立即复用上一份报告并说明这一点;即使如此,--fresh仍会完整运行。
写入的内容:
.orangepro/
├── short_behavior-coverage.html ← one-page summary
├── behavior-coverage.html ← detailed report: worklist, map, run details
├── tests.csv ← drafted tests, one row per test
├── report-data.json ← the data both reports show (used to compare and reuse runs)
├── run-key.json, last-start.json ← what the last run saw, so an unchanged repo is not analysed again
├── graph.json ← the evidence graph (deterministic)
├── ledger.json ← proof certificates
├── rtm.md ← traceability matrix
└── config.json ← optional per-repo settings
orangepro_generated/ ← generated tests (only with a model key); your files are never edited
证据等级
每个函数恰好对应一个证据标签。上面的四种待办事项都由它确定。
| 证据 | 含义 | 待办事项 |
|---|---|---|
| 已证明 | 测试在原始代码上通过;而在隔离副本中破坏该函数后,测试在自身断言处失败。 | 完成 |
| 测试运行过 | 你运行的覆盖率工具执行了这段代码。 | 证明 |
| 已关联 | 某个测试调用了这个确切函数。这是结构上的关联,不是证明。 | 证明 |
| 未确认 | 某个测试文件或名称相似的测试指向这里,但没有追踪到调用。这只是线索,不是证据。 | 检查 |
| 未找到测试 | 没有任何测试与之关联。 | 编写 |
如果证明已运行但未能捕获问题,该函数会变为 编写;如果证明是在代码变更前完成的,则会重新变为 证明。
OrangePro 不计入的内容,因此已关联数量只是下限,不是覆盖率百分比:
- 只对模拟对象进行断言的测试;
- 通过 HTTP 发起的调用或来自端到端测试套件的调用;
- 在 Python 中,仅通过 fixture 才能到达测试的对象。
为标记出的代码路径编写新测试之前,请先检查现有测试。
首次运行时显示“已证明 0”很正常。 证明会运行你的测试,因此只会针对你选择的函数运行,或在
opro start的尝试预算内运行。
排名原理
每个未经验证的函数都会获得一个 OrangePro 风险分数,ORS = P × I × D:
- P:函数发生变更的可能性。变更历史、扇出、新代码和代码规模。
- I:函数可能造成的影响。入站引用、入口点位置、数据敏感性,以及两次调用内可到达删除或清除操作的路径所适用的最低分数。
- D:问题被发现的难易程度。证据等级(关联测试或覆盖率运行记录比名称匹配或毫无证据更容易发现问题),以及是否在无人值守的情况下运行(作业和调度程序)。
分数决定工作顺序,并不代表缺陷概率。权重固定,不涉及任何 AI 模型。报告会显示每一行背后的输入。
验证测试
# Python: the mutation value is derived from the function (return annotation or its observed result)
opro prove-loop --target-symbol 'sym:app/billing/invoices.py#void_invoice' \
--test 'tests/test_invoices.py::test_void_marks_invoice_void' --replacement sentinel
# TypeScript / JavaScript: give the inert body to substitute
opro prove-loop --target-symbol 'sym:src/orders.service.ts#OrdersService.cancel' \
--test src/orders.service.spec.ts --replacement 'return null;'
- **已验证:**测试在原始代码上通过,在有问题的副本上会在自身断言处失败。
- **未验证:**测试在有问题的副本上仍然通过,因此无法保护该函数。这同样会被列为发现项。
- **无法运行:**设置失败。这种情况不会计入任何一方。
无需模型密钥即可查找薄弱测试:
opro roast . # passing tests whose targeted mutant still survives
与编码 Agent 配合使用
OrangePro 以 MCP 服务的形式运行。将它添加到客户端的配置中:
{
"mcpServers": {
"orangepro-local": {
"command": "npx",
"args": ["-y", "@orangepro/mcp-server@latest", "mcp"]
}
}
}
| 客户端 | 配置位置 |
|---|---|
| Claude Code | .mcp.json 或 ~/.claude.json |
| Cursor | ~/.cursor/mcp.json 或 Settings → MCP |
| VS Code / Copilot | MCP 设置 |
| Codex / OpenCode / Windsurf | 运行 npx -y @orangepro/mcp-server@latest agent --client codex 以打印设置说明 |
运行完整流程的提示词:
“使用
orangepro_start,然后使用orangepro_find_test_gaps。针对排名最高的缺口,在建议的路径下编写测试并运行,然后调用orangepro_prove_loop,告诉我是否已验证。”
配置
可选。将配置放在仓库中的 .orangepro/config.json,或放在 ~/.orangepro/config.json 中以设置适用于所有仓库的默认值。所有会影响排名的设置都会显示在报告中。
{
"classification": {
"rank_exclude_paths": ["ui/**", "docs/**", "scripts/**"],
"test_support_paths": ["internal/testutil/**"],
"destructive_sinks": ["archive*"]
},
"tuning": { "churn_window_days": 180 },
"proof": { "python_runner": "auto", "attempt_limit": 20 },
"overrides": [
{ "symbol": "sym:src/legacy/shim.ts#shim", "action": "suppress", "reason": "generated shim, not product code" }
]
}
rank_exclude_paths会将路径从排名中排除,但仍会将其计为行为。destructive_sinks会为你的代码库添加类似删除的调用。- 覆盖项(
suppress、pin、reclassify)都必须附带原因,报告也会列出这些覆盖项。 - 权重和等级无法配置。
语言支持
| 语言 | 映射函数 | 关联调用这些函数的测试 | 起草测试 | 变异验证 |
|---|---|---|---|---|
| TypeScript / JavaScript | ✓ | ✓ | ✓ Jest、Vitest、Mocha | ✓ Jest、Vitest、Mocha |
| Python | ✓ | ✓ | ✓ pytest | ✓ pytest |
| Go | ✓ | ✓ | ✓ *_test.go | ✓ go test |
| Java | ✓ | ✓ | ✓ JUnit 4 和 5 | ✓ 仅支持使用 JUnit 5 的 Maven |
| Kotlin、Rust、PHP、C#、Ruby、Swift、C、C++ | ✓ | 仅匹配名称 | 尚未支持 | 尚未支持 |
- “仅匹配名称”表示看起来与函数相关的测试文件或测试名称会被标记为未确认(Check)。系统不会追踪调用,因此目前这些语言无法达到已关联或已验证状态。
- TypeScript 和 JavaScript 使用 TypeScript 编译器进行解析;其他语言使用 tree-sitter。
- Python 验证会通过仓库自身的环境运行 pytest:先使用现有的
.venv或venv,然后在存在相应锁文件时使用uv或poetry,否则运行python -m pytest。设置proof.python_runner可使用你自己的命令。 - Java 验证需要 Maven(Surefire)和 JUnit 5。Gradle 和 JUnit 4 项目可以映射并关联,但尚未验证。
- **尚未追踪,**因此已测试的代码可能会显示为未确认:通过 Go 测试套件方法和辅助构造函数进行的调用、在运行时注入的依赖、反射,以及通过 HTTP 或 RPC 发出的调用。
要求和限制
- 在 macOS 或 Linux 上使用已修补的 Node.js:22.23.4 或更高版本的 22.x、24.22.1 或更高版本的 24.x,或 26.12.1 或更高版本。 Windows 未经测试:证明流程使用 POSIX 路径和符号链接。
- 使用已修补的 Node.js。 2026 年 10 月 21 日发布的 Node.js 安全更新(22.23.4、24.22.1、26.12.1)修复了多个高危问题,而 Node.js 20 已终止生命周期,不会再获得修复。奇数主版本(23、25)没有已修补版本。
package.json中的engines字段记录了这一要求,但除非设置engine-strict=true,否则 npm 只会发出警告。使用node -v检查版本。参见 Node.js 安全更新公告。 - Git,用于变更历史。 如果没有 Git,或使用的是浅克隆,排序只依据结构,报告会注明这一点。不是 Git 工作区的文件夹始终会运行完整分析。
- 先安装仓库的依赖项(
npm ci、uv sync、go mod download、mvn -q install,……)。证明流程会在隔离副本中运行你自己的测试,并要求测试在该副本中通过。 - 读取范围: 源文件和测试文件;跳过
.gitignore或.orangeproignore中的内容(不支持使用!进行反向匹配)、常见构建和依赖项目录(node_modules、vendor、dist、build、target、coverage、.venv,……)、大于 1 MB 的文件,以及生成的代码(标记为Code generated … DO NOT EDIT的文件)。最多读取 100,000 个文件;ORANGEPRO_MAX_FILES可降低此上限,ORANGEPRO_MAX_ANALYZE_MS可设置扫描时限。 - 测试草拟涵盖优先级最高的 20 个函数,每个函数草拟两个测试,顺序与工作清单一致;报告会显示这 20 个函数。草拟内容会保留,直至对应函数的代码发生变更。
- 复用一次运行时,何为“没有任何变更”: 提交、Git 不忽略的所有已修改或未跟踪文件、OrangePro 的设置和忽略文件、覆盖率文件、证明记录、
start选项、是否设置了模型密钥,以及分析版本。若测试草拟因提供商错误(额度不足、速率限制)而失败,则会重新完整运行。 - CSV 列映射遵循各工具的 CSV 导入器(参见导入 tests.csv)。首次导入时请检查导入预览。
隐私和网络使用
- 不会发送任何关于你的代码或运行的信息。 不会收集使用情况遥测数据。
- 源代码只在进程内读取,绝不会存储或上传。报告和证据图仅包含元数据,不包含你的源代码。
- 绝不会编辑你的源文件。 证明流程会在隔离副本中运行。
- 只有在你配置密钥后才会调用模型, 并且请求会直接从你的计算机发送给你选择的提供商。密钥、提供商、其端点和模型只从你的 shell 环境或 MCP 客户端配置的
env区块中读取。OrangePro 不读取任何.env文件,因此你扫描的仓库无法选择密钥的发送位置,OrangePro 也绝不会在任何地方写入密钥。opro setup只会保存提供商和模型名称。 - 配置密钥后,报告和
tests.csv会包含模型草拟的测试, 提示词会包含作为依据的函数名称、文件和证据。 - 报告不会从网络加载任何内容。 只有你点击的链接会访问外部网站。
反馈
报告包含一个 提供反馈 链接,每项发现都包含一个 这看起来不对 链接。有时,报告还会在发现项之后询问报告是否有帮助。
- 链接不会携带任何关于你项目的信息。 表单只会发送你查看并提交的内容。
- 除非你留下电子邮件地址,否则你会保持匿名。
opro feedback # print the link and your settings
opro feedback off # stop the "Did this help?" question (links stay)
ORANGEPRO_FEEDBACK_URL=off # hide every feedback link
此问题最多每 14 天出现一次(ORANGEPRO_FEEDBACK_COOLDOWN_DAYS)。该偏好设置只存储在你的计算机上。MCP 客户端会将链接作为可选结果元数据(_meta["ai.orangepro/feedback_url"])获取,且不会要求你的 Agent 提示你提供反馈。
参考
命令行
```bash opro # same as opro start . opro start . --no-ai --no-auto # analyze + reports, no model calls, no proof attempts opro start . --fresh # run in full even when nothing changed since the last run opro start --base main # scope to a branch diff opro analyze # build the evidence graph and reports opro gaps --limit 10 # top unproven behaviors, ranked opro prove-loop ... # mutation proof for one function (see above) opro roast . # find tests whose mutant survives (no key needed) opro doctor --proof # why top targets aren't proven yet opro generate --base main # tests for what this branch changed (needs a model key) opro rtm # traceability matrix opro export # metadata-only evidence pack opro coverage # find or generate runtime coverage artifacts opro feedback [on|off] # feedback link and invitation setting opro mcp # run as an MCP server (stdio) ``` 在任意读取命令中添加 `--json`,即可获取机器可读的输出。运行 `opro help` 查看所有标志。MCP 工具(18 个)
| 工具 | 功能 |
|---|---|
orangepro_start | 分析、编写两份报告和 tests.csv,并返回后续操作;如果没有任何更改,则立即返回 unchanged_since(fresh 会强制完整运行) |
orangepro_analyze_sources | 构建或刷新证据图 |
orangepro_find_test_gaps | 按 ORS 排序的未证实行为 |
orangepro_prove_loop | 针对单个行为执行设置 + 变异验证 + 刷新报告 |
orangepro_prove | 仅执行变异验证 |
orangepro_generate_tests | 为缺口生成有依据的测试(需要模型密钥) |
orangepro_changed_impact | 查看差异影响的内容 |
orangepro_status | 查看工作区状态,不运行任何操作 |
orangepro_doctor | 查看下一步应添加哪些证据 |
orangepro_graph_score | 图谱就绪度(0–100) |
orangepro_rtm | 可追溯性矩阵 |
orangepro_stats | 汇总统计信息 |
orangepro_record_run | 记录测试运行结果 |
orangepro_explain_test | 说明生成测试的原因 |
orangepro_export_evidence_pack | 仅含元数据的证据包 |
orangepro_update_graph | 增量更新图谱 |
orangepro_ai_links | 弱行为→代码建议(可选 AI,不作为证据) |
orangepro_ai_flows | 候选流程(可选 AI,不作为证据) |
覆盖率产物
先运行自己的单元测试和集成测试覆盖率,然后运行 opro start。OrangePro 会导入 Go coverprofiles、lcov、coverage.py XML 和 JaCoCo XML,并将单元测试、集成测试和未分类覆盖率分别保留。要为产物添加标签,请添加 .orangepro/coverage-suites.json:
{
"artifacts": {
".orangepro/coverage/unit.coverprofile": { "suite": "unit", "command": "make unit-test-coverage" },
".orangepro/coverage/integration.coverprofile": { "suite": "integration", "command": "make integration-test-coverage" }
}
}
模型设置(自带密钥,仅用于生成)
| 提供商 | 环境变量 |
|---|---|
| OpenAI 兼容 | OPENAI_API_KEY(可选:OPENAI_BASE_URL、OPENAI_MODEL) |
| Anthropic | ANTHROPIC_API_KEY(可选:ANTHROPIC_MODEL) |
| Ollama(本地,无需密钥) | OLLAMA_BASE_URL(可选:OLLAMA_MODEL) |
自动检测顺序:OpenAI → Ollama → Anthropic。使用 --provider 和 --model 覆盖,或运行 opro setup。
- 模型输出绝不会改变证据等级。 只有变异验证才能将某项行为标记为已证实。
- 生成的测试会写入
orangepro_generated/,并附带其所依据的文件和现有测试,以及运行方式和位置。 - 代码未通过编译检查的草稿会作为计划保留(“仅计划”),并注明原因。如果没有密钥,排名前 20 的每项都会显示两个空槽位,并附上可复制到编码 Agent 的提示词。
导入 tests.csv
每个测试占一行,编码为 UTF-8。前 12 列用于导入;其余列会为每个测试保留优先级、证据和验证命令。排名最高的五个函数优先级为 High,其余为 Medium。
tests.csv 中的列 | TestRail | Jira Xray | Zephyr Scale |
|---|---|---|---|
| ID | Test Case Identifier | (将 Key 留空) | |
| Title | Title | Summary | Name |
Section(a > b) | Sections Hierarchy | ||
Folder(a/b) | Test Repository Path | Folder | |
| Priority | Priority | Priority | Priority(将 Medium 映射为 Normal) |
| Test type | Type | Labels | Labels |
| Preconditions | Preconditions | (在 Xray 中使用独立问题;如需添加到 Description) | Precondition |
| Steps | Manual Test Step: Action | ||
| Test data | Manual Test Step: Data | ||
| Steps with data | Steps | Test Script (Steps) - Step | |
| Expected result | Expected Result | Manual Test Step: Expected Result | Test Script (Steps) - Expected Result |
| References | References | Description | Objective |
PR 工作流
opro generate --base main # tests for what this branch changed (read-only git diff)
opro generate --changed # current branch vs its base
opro generate --pr 1234 # checks out PR #1234 (asks first; refuses on a dirty tree)
托管平台
此仓库提供免费的本地工具。OrangePro 平台还提供:
- 跨 PR 和仓库持久保存的图谱;
- 针对证据和风险变更的 CI 门禁;
- 需求与事件关联;
- 团队仪表板。
参与贡献
git clone https://github.com/OrangeproAI/orangepro-mcp.git
cd orangepro-mcp && npm ci && npm run build
npm test
欢迎提交 PR。对于较大的更改,请先创建 issue。
MIT 许可证 · orangepro.ai
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。