自动化与脚本
为 Bash 脚本建立 100%…
当你需要为 bash shell 脚本编写系统化测试套件、追求 100% 覆盖率并验证性能目标时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
为 Bash 脚本建立 100% 覆盖率通用
解决思路
- 采用 100% 覆盖率规则:每个核心功能(导航、缓存、书签、历史、基准测试、新功能)都必须 100% 覆盖,即每个函数、每条代码路径、每个错误条件、每个边界情况、每个性能目标都要有测试。
- 遵循 TDD 工作流:先根据功能规格写测试 → 看测试失败(红)→ 实现功能 → 看测试通过(绿)→ 必要时重构 → 确认所有测试仍通过。
- 每个测试文件使用标准结构:#!/bin/bash 开头、set -e、通过 SCRIPT_DIR 定位并 source 被测模块、初始化 TESTS_PASSED/TESTS_FAILED 计数器、定义 pass()/fail() 辅助函数、按类别组织测试函数、最后打印汇总并以 [ $TESTS_FAILED -eq 0 ] && exit 0 || exit 1 退出。
- 每个测试函数严格遵循 Arrange-Act-Assert 三段式:Arrange 准备输入/期望值/临时文件,Act 执行被测函数并捕获结果与退出码,Assert 用 if 比较结果与期望并调用 pass/fail。
- 为每个功能编写四类测试:①单元测试(单函数隔离、依赖最少、<1ms、覆盖有效/无效/空/边界输入、返回码、输出格式);②集成测试(多模块协作、真实工作流、数据持久化、状态变更、错误传播、清理行为、<100ms);③边界情况(空输入、缺失文件、畸形数据、超长输入、特殊字符、并发访问、资源耗尽、权限错误);④性能测试(测量关键路径耗时、对比目标、真实规模、最大负载、统计 min/max/mean/median、防止性能回归)。
- 使用断言模式库:字符串相等 assert_equal、退出码 assert_success/assert_failure、数值比较 assert_less_than/assert_greater_than、文件系统 assert_file_exists/assert_dir_exists/assert_file_contains/assert_line_count、输出 assert_output_contains/assert_output_empty。
- 建立可复用的 test-helpers.sh:setup_test_env/teardown_test_env(用 mktemp -d 建临时目录并备份还原 ~/.goto_index、~/.goto_bookmarks、~/.goto_history)、create_test_cache/create_test_bookmarks/create_test_history 生成测试数据、time_function_ms 计时、assert_function_exists/assert_variable_set。
- 性能测试用 date +%s%N 取纳秒时间戳,计算 duration=$(((end - start) / 1000000)) 毫秒并与目标比较(如缓存查询 <100ms、缓存构建 <5000ms、历史检索 <10ms、500 文件夹规模下查询 <100ms)。
- 保证测试独立性:每个测试自己 setup 环境、自己清理资源,不依赖前一个测试留下的状态,可单独运行。
- 使用有意义的失败信息:fail 中打印期望值、实际值、退出码,而非笼统的 'Test failed'。
- 控制测试速度:单元测试 <1ms、集成测试 <100ms、边界测试 <10ms,整个测试套件应在 5 秒内跑完。
- 遵循命名约定:测试文件 test-cache.sh/test-bookmark.sh/test-navigation.sh/test-benchmark.sh;测试函数 test_[category]_[feature]_[scenario](如 test_unit_cache_lookup_single_match)。
- 用 bash test-cache.sh 运行单个套件,用 && 串联运行全部套件,用 set -x 输出详细日志,用 bash -c 'source test-cache.sh; test_xxx' 运行单个测试函数。
- 用覆盖率检查清单收尾:所有公开函数已测、所有代码路径已走、所有返回码已验证、所有错误条件已测、所有边界情况已覆盖、性能目标已验证。
适用边界 · 注意事项
- 不要用于测试非 shell 应用(应使用对应语言的测试框架)。
- 不要用于简单的临时脚本验证或生产环境测试(仅用于开发/CI)。
- 不要用于通用 QA 测试(这是面向开发者的单元测试)。