一键导入
moonbit-testing
MoonBit 测试开发技能。提供 MoonBit 测试框架、单元测试、快照测试、黑盒/白盒测试等完整参考。TRIGGER when: 用户编写 MoonBit 测试、运行测试、调试测试失败、或需要了解 MoonBit 测试最佳实践时触发。SKIP: 非 MoonBit 语言的测试任务。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
MoonBit 测试开发技能。提供 MoonBit 测试框架、单元测试、快照测试、黑盒/白盒测试等完整参考。TRIGGER when: 用户编写 MoonBit 测试、运行测试、调试测试失败、或需要了解 MoonBit 测试最佳实践时触发。SKIP: 非 MoonBit 语言的测试任务。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
MoonBit FFI(外部函数接口)互操作技能。提供 MoonBit 与 JavaScript、C、Wasm 等后端的互操作参考,包括外部类型声明、函数导入导出、回调处理、内存管理等。TRIGGER when: 用户需要 MoonBit 与外部语言互操作、声明外部函数、处理 FFI 回调、或调试 FFI 相关问题时触发。SKIP: 纯 MoonBit 代码开发。
MoonBit 语言开发技能。提供 MoonBit 语言的核心语法、数据类型、控制结构、错误处理、方法与 traits、泛型、模式匹配等完整参考。TRIGGER when: 用户编写 MoonBit 代码、询问 MoonBit 语法、需要 MoonBit 代码示例、调试 MoonBit 程序、或需要了解 MoonBit 语言特性时触发。SKIP: 非 MoonBit 语言的开发任务。
MoonBit 工具链技能。提供 moon 构建工具、项目管理、包管理、格式化、文档生成等完整参考。TRIGGER when: 用户使用 moon 命令、创建 MoonBit 项目、管理依赖、格式化代码、生成文档、或需要了解 MoonBit 工具链时触发。SKIP: 纯 MoonBit 代码编写(使用 moonbit-language 技能)。
| name | moonbit-testing |
| description | MoonBit 测试开发技能。提供 MoonBit 测试框架、单元测试、快照测试、黑盒/白盒测试等完整参考。TRIGGER when: 用户编写 MoonBit 测试、运行测试、调试测试失败、或需要了解 MoonBit 测试最佳实践时触发。SKIP: 非 MoonBit 语言的测试任务。 |
本技能提供 MoonBit 测试框架的完整参考,包括测试编写、快照测试、黑盒/白盒测试等核心内容。
当用户执行以下操作时触发此技能:
moon test 命令以下情况不触发此技能:
moonbit-language 技能)MoonBit 提供 test 代码块用于编写内联测试。它本质上是一个返回 Unit 但可能抛出 Error 的函数。
test "测试名称" {
// 测试代码
assert_eq(1 + 1, 2)
}
// 相等性断言
assert_eq(actual, expected)
// 不等断言
assert_ne(actual, unexpected)
// 布尔断言
assert(condition)
assert(!condition)
测试名称以 "panic" 开头时,表示期望触发 panic:
test "panic: 除以零" {
let _ = 1 / 0 // 期望 panic
}
MoonBit 提供三种快照测试,均可通过 moon test --update 自动插入或更新。
使用 inspect 检查实现了 Show trait 的内容:
test "show 快照" {
let point = { x: 1.0, y: 2.0 }
inspect(point, content="point")
}
运行 moon test --update 后会自动生成快照文件。
对于复杂数据结构,使用 JSON 快照更易读:
struct Config {
name : String
version : Int
debug : Bool
} derive(ToJson)
test "json 快照" {
let config = { name: "MyApp", version: 1, debug: true }
@json.inspect(config, content=config)
}
使用 @test.T::write 和 @test.T::writeln 记录整个过程的输出:
test "通用快照" {
@test.T::writeln("步骤 1: 初始化")
@test.T::writeln("步骤 2: 处理")
@test.T::writeln("步骤 3: 完成")
@test.T::snapshot() // 必须在末尾使用
}
快照文件保存在包的 __snapshot__ 目录下。
| 类型 | 访问范围 | 文件命名 |
|---|---|---|
| 白盒测试 | 包中所有成员 | 内联或 *_wbtest.mbt |
| 黑盒测试 | 仅公开成员 | *_test.mbt |
可访问包内所有成员,适合测试内部实现细节:
// 文件: internal_wbtest.mbt
test "测试内部函数" {
// 可以访问私有函数和类型
let result = internal_helper()
assert_eq(result, expected)
}
仅访问公开成员,适合验证库的公共 API:
// 文件: api_test.mbt
test "测试公共 API" {
// 只能访问公开的函数和类型
let result = public_function()
assert_eq(result, expected)
}
{
"import": ["dependency1", "dependency2"],
"wbtest-import": ["test-dependency1"],
"test-import": ["test-dependency2"]
}
import: 正常导入的包wbtest-import: 白盒测试额外导入的包test-import: 黑盒测试额外导入的包# 运行所有测试
moon test
# 运行特定包的测试
moon test --package package_name
# 运行特定文件的测试
moon test --package package_name --file test_file.mbt
# 运行特定测试(按索引)
moon test --package package_name --file test_file.mbt --index 0
# 更新快照
moon test --update
# 限制快照更新次数
moon test --update --limit 100
# 只构建不运行
moon test --build-only
# 顺序执行(不并行)
moon test --no-parallelize
# 以 JSON 格式输出失败信息
moon test --test-failure-json
moon test --doc
// 好的命名:描述行为
test "空数组应该返回长度 0" {
assert_eq([].length(), 0)
}
// 好的命名:描述边界情况
test "负数输入应该抛出错误" {
// ...
}
// panic 测试必须以 "panic" 开头
test "panic: 无效输入" {
// ...
}
对于复杂输出,使用快照测试比手动断言更易维护:
test "复杂结构输出" {
let result = process_complex_data()
inspect(result, content=result)
}
test "错误处理" {
let result = try? risky_operation()
match result {
Ok(value) => assert_eq(value, expected)
Err(_) => assert(false)
}
}
test "边界条件:空输入" {
assert_eq(process(""), default_value)
}
test "边界条件:最大值" {
assert_eq(process(Int::max_value()), expected)
}
test "参数化测试" {
let cases = [(1, "one"), (2, "two"), (3, "three")]
for (input, expected) in cases {
assert_eq(to_string(input), expected)
}
}
# 查看失败的详细信息
moon test --test-failure-json
# 查看快照差异
moon test --update # 会显示差异
当预期输出改变时,更新快照:
moon test --update
使用 skip 属性临时跳过测试:
#skip
test "暂时跳过的测试" {
// ...
}
# 运行覆盖率分析
moon coverage analyze
# 生成报告
moon coverage report
# 清理覆盖率数据
moon coverage clean
在构建时启用覆盖率:
moon build --enable-coverage
moon test --enable-coverage
__snapshot__ 目录,需要提交到版本控制--update 更新快照,不要手动修改"panic" 开头@test.T::snapshot:必须在测试块末尾使用,因为它总是抛出异常