用途
Shell Testing Framework 是一套面向 bash shell 脚本的测试技能,提供来自 unix-goto 项目的测试模式与方法论,核心目标是实现 100% 测试覆盖率、系统化组织测试并进行性能验证。
主要能力
- 指导编写 bash shell 脚本的测试套件。
- 支持实现 100% 测试覆盖率要求。
- 将测试组织为单元测试、集成测试、边界用例和性能测试四类。
- 提供 shell 脚本验证的断言模式。
- 指导搭建测试基础设施与辅助函数。
- 支持为 shell 函数编写性能测试。
- 支持生成测试报告与摘要。
- 支持调试测试失败与验证 shell 脚本行为。
核心测试理念
100% 覆盖率规则
unix-goto 中每个核心功能都要求 100% 测试覆盖率,这是不可协商的。覆盖要求包括:核心导航 100%、缓存系统 100%、书签 100%、历史记录 100%、基准测试 100%、新功能 100%。这意味着每个函数都有测试、每条代码路径都被执行、每个错误条件都被验证、每个边界用例都被覆盖、每个性能目标都被验证。
测试驱动开发方法
工作流程为:先根据功能规格编写测试(红),观察测试失败,实现功能,观察测试通过(绿),必要时重构,最后验证所有测试仍然通过。
使用方式
标准测试文件结构
每个测试文件遵循固定结构:设置 set -e、确定脚本目录并 source 被测模块、初始化通过/失败计数器、定义 pass/fail 辅助函数、编写测试函数、执行测试、输出摘要并以适当退出码结束(失败数为 0 则退出 0,否则退出 1)。
Arrange-Act-Assert 模式
每个测试函数必须遵循三阶段结构:Arrange(准备测试条件,如输入值、期望值、临时文件)、Act(执行被测代码并捕获结果与退出码)、Assert(验证结果,通过则 pass,否则 fail 并输出期望与实际值)。
四类测试
- 单元测试:隔离测试单个函数,依赖最少,执行快(每测试 <1ms),断言清晰聚焦。检查项包括有效输入、无效输入、空输入、边界值、返回码、输出格式。
- 集成测试:测试多个模块协同工作,验证真实工作流与端到端行为,执行时间适中(每测试 <100ms)。检查项包括常见用户工作流、模块交互、数据持久化、状态变化、错误传播、清理行为。
- 边界用例:测试边界条件与异常场景,包括异常但有效的输入、边界条件、错误场景、竞态条件、资源限制。检查项包括空输入、缺失文件、畸形数据、超大输入、特殊字符、并发访问、资源耗尽、权限错误。
- 性能测试:验证性能目标是否达成,测量执行时间、与目标对比、使用统计分析、按规模测试。检查项包括测量关键路径操作、与既定目标对比、按真实规模测试、最大负载测试、计算统计量(最小/最大/均值/中位数)、验证无性能回退。
断言模式
- 基本断言:字符串相等(assert_equal)、退出码断言(assert_success、assert_failure)、数值比较(assert_less_than、assert_greater_than)。
- 文件系统断言:文件存在性检查(assert_file_exists)等。
适用场景
- 为 bash shell 脚本编写测试套件。
- 实现 100% 测试覆盖率要求。
- 将测试组织为单元、集成、边界用例和性能四类。
- 创建 shell 脚本验证的断言模式。
- 搭建测试基础设施与辅助函数。
- 为 shell 函数编写性能测试。
- 生成测试报告与摘要。
- 调试测试失败。
- 验证 shell 脚本行为。
限制
不适用于以下场景:测试非 shell 应用(应使用对应语言的框架)、简单临时脚本验证、生产环境测试(仅用于开发/CI)、通用 QA 测试(本技能面向开发者的单元测试)。