A pure-MoonBit declarative API test runner: parses .probe cases, sends HTTP requests, asserts responses, and emits console / JUnit XML reports.
| 项目 | 内容 |
|---|---|
| 项目名称 | MoonProbe |
| 参赛者 | 吴海婷 |
| 联系方式 | 19177746962@163.com |
| GitHub 仓库 | https://github.com/wuhaiting321/MoonProbe |
| 项目方向 | MoonBit 开发者工具 / API 测试基础设施 |
| 是否为移植项目 | 否,原创项目 |
| 模块名 | wuhaiting321/moonprobe(遵循 mooncakes.io 的 <author>/<module> 命名规范) |
| 代码规模 | 4030 行 MoonBit 源码 + 4468 行测试代码,16 个 .mbt 文件,合计 8498 行 |
| 测试状态 | moon test --target wasm-gc 全部通过(237 个用例,0 失败);js 后端在此基础上另含 9 个真实网络用例 |
| 构建状态 | wasm-gc 与 js 后端 moon check 零错误、零告警 |
| 开源许可证 | Apache-2.0 |
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| MoonBit 工具链 | moonc ≥ 0.10.14 | 项目以 MoonBit 为主要实现语言;CI 每次都安装官方发布的最新工具链进行验证 |
| Node.js | 运行 .probe 用例时需要 | CLI 在 js 后端通过 Node.js 调用宿主机 curl;moon check / moon test 不需要 |
| 网络 | 运行会访问真实站点的用例时需要 | 单元测试完全离线,不受网络影响 |
curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash
export PATH="$HOME/.moon/bin:$PATH"
moon version --all # 应显示 moonc v0.10.14 或更高若 cli.moonbitlang.com 不可达,可改用镜像 https://cli.moonbitlang.cn/install/unix.sh (CI 中即按此顺序回退重试)。Windows 安装包见 https://www.moonbitlang.com/download/。
git clone https://github.com/wuhaiting321/MoonProbe.git
cd MoonProbemoon run cli --target js -- examples/example_com.probe[PASS] example.com answers with 200
Summary: 1 total, 1 passed, 0 failed in 3742 ms
Result: PASSED运行 CLI 必须带 --target js,原因见 5.5 节。
moon add wuhaiting321/moonprobe| 包 | 职责 | 源码规模 |
|---|---|---|
| parser/ | 词法分析、AST 定义、.probe 文件解析(含 config: 块) | 1835 行 |
| runner/ | 配置合并、占位符插值、HTTP 传输、变量提取与用例编排 | 1244 行 |
| assert/ | 状态码、JSON 路径、文本、长度、类型、schema、耗时断言 | 598 行 |
| reporter/ | 控制台报告输出、JUnit XML 报告生成 | 164 行 |
| cli/ | 命令行入口、宿主文件读写 FFI | 189 行 |
# 套件级全局配置:对本文件的所有用例生效
config:
base_url: "https://httpbin.org" # 相对 url 的基址
global_timeout: 8000 # 每个用例的默认超时(毫秒)
global_headers: # 每个用例都会带上的请求头
Accept: "application/json"
Authorization: "Bearer ${API_TOKEN}" # 值里可以引用宿主环境变量
name: "1. read the token from the response"
request:
method: GET
url: "/response-headers" # 相对 url:拼接 config 里的 base_url
query:
# httpbin 会把查询参数原样变成响应头,方便演示三种取值来源
echo: "demo-token-42"
X-Trace-Id: "trace-7f3a"
Set-Cookie: "session=abc123"
expect:
status: 200
json:
echo: "demo-token-42" # 点号路径校验嵌套字段
contains: "demo-token-42" # 原始响应文本必须包含该子串
type:
echo: string # JSON 类型
duration_ms <= 2000 # 耗时预算
set: token = echo # 从响应 JSON 取值
set: trace = header.X-Trace-Id # 从响应头取值
set: sid = cookie.session # 从 Cookie 取值
name: "2. send the extracted token back"
request:
method: GET
url: "/get"
timeout: 3000 # 用例级超时,优先于 global_timeout
query:
echo: "{{token}}" # 引用上一个用例提取的变量
headers:
Authorization: "Bearer {{token}}"
expect:
status: 200
json:
args.echo: "demo-token-42"
schema:
args: object! # 必需字段用 `!` 标记
echo: string! # object 下的缩进行是它的嵌套结构
url: string!# 注释既可独占一行(缩进随意),也可跟在任意一行末尾;两者都在词法阶段 被剥离,所以既不影响缩进判定,也不会混进值里。引号内的 # 不算注释,紧贴 文本的 # 也不算——url: https://x/a#frag 会保留 #frag。值本身要以 # 开头时必须加引号,例如 contains: "#tag"。
| 维度 | .http / hurl / Karate | moon test | MoonProbe |
|---|---|---|---|
| 用例形态 | 文本 / 脚本 | MoonBit 源码 | .probe 文本 |
| 验证对象 | 运行中的服务(黑盒) | 源码函数(白盒) | 运行中的服务(黑盒) |
| 实现语言 | 各自宿主语言 | MoonBit | 纯 MoonBit |
| CI 报告 | 各自格式 | moon test 输出 | 终端报告 + JUnit XML |
| 用例间状态传递 | 部分支持 | 依赖代码变量 | set: + {{var}} 上下文串联 |
| 套件级配置与环境变量 | 各自语法 | 无 | config: 块 + ${ENV} 注入 |
| 断言族 | 视工具而定 | 由代码自行编写 | 状态码 / JSON / 文本 / 长度 / 类型 / schema / 耗时 |
# 静态检查与单元测试(不依赖网络与 Node.js)
moon check --target wasm-gc
moon test --target wasm-gc
# 运行示例用例:CLI 必须显式指定 --target js
moon run cli --target js -- examples/httpbin.probe
# 生成 JUnit XML 报告
moon run cli --target js -- examples/auth_chain.probe --junit junit.xml运行 CLI 必须使用 --target js。 CLI 通过 extern "js" 调用宿主机 curl 发起真实 HTTP 请求,并依赖 JS 宿主读写 .probe 用例文件与报告文件; 用其他后端(如 native)运行会直接失败。模块的 preferred_target 也已设为 js。
bash check_验收.sh # Linux / macOS
powershell -ExecutionPolicy Bypass -File .\check_验收.ps1 # WindowsInstall
Download zipA pure-MoonBit declarative API test runner: parses .probe cases, sends HTTP requests, asserts responses, and emits console / JUnit XML reports.