name: bats-test-scaffolder description: 为Shell脚本测试生成BATS测试结构及夹具,包括设置/清理、断言和模拟功能。 allowed-tools: 读取、写入、编辑、Bash、Glob、Grep
BATS测试脚手架
为Shell脚本测试生成BATS测试结构。
功能
- 生成BATS测试文件
- 创建设置和清理夹具
- 实现自定义断言
- 设置模拟助手
- 配置测试隔离
- 生成测试助手
使用场景
当您需要时调用此技能:
- 为Shell脚本设置BATS测试
- 创建测试夹具和助手
- 实现模拟函数
- 生成测试用例
生成的测试结构
tests/
├── bats/
│ └── bats-*.bash # BATS子模块
├── test_helper/
│ ├── common-setup.bash # 通用设置
│ └── mocks.bash # 模拟助手
├── fixtures/
│ ├── input.txt # 测试夹具
│ └── expected.txt
└── *.bats # 测试文件
测试文件模板
#!/usr/bin/env bats
# 加载测试助手
load 'test_helper/common-setup'
# 每个测试前运行的设置
setup() {
common_setup
# 测试特定设置
export TEST_DIR="$(mktemp -d)"
}
# 每个测试后运行的清理
teardown() {
# 清理
rm -rf "${TEST_DIR}"
}
@test "脚本使用--help显示帮助信息" {
run ./script.sh --help
assert_success
assert_output --partial "用法:"
}
@test "脚本缺少必需参数时失败" {
run ./script.sh
assert_failure
assert_output --partial "缺少必需参数"
}
@test "脚本处理输入文件" {
cp fixtures/input.txt "${TEST_DIR}/"
run ./script.sh "${TEST_DIR}/input.txt"
assert_success
assert_output --partial "处理完成"
}
@test "脚本创建输出文件" {
run ./script.sh -o "${TEST_DIR}/output.txt" fixtures/input.txt
assert_success
assert_file_exists "${TEST_DIR}/output.txt"
}
@test "脚本处理文件名中的特殊字符" {
local special_file="${TEST_DIR}/file with spaces.txt"
echo "test" > "${special_file}"
run ./script.sh "${special_file}"
assert_success
}
测试助手 (test_helper/common-setup.bash)
#!/usr/bin/env bash
# 加载BATS支持库
load 'bats/bats-support/load'
load 'bats/bats-assert/load'
load 'bats/bats-file/load'
# 所有测试的通用设置
common_setup() {
# 获取包含目录
PROJECT_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
# 将脚本添加到PATH
PATH="${PROJECT_ROOT}/bin:${PATH}"
# 设置测试临时目录
TEST_TEMP_DIR="$(mktemp -d)"
}
# 通用清理
common_teardown() {
rm -rf "${TEST_TEMP_DIR}"
}
# 自定义断言:检查退出代码
assert_exit_code() {
local expected="$1"
if [[ "${status}" -ne "${expected}" ]]; then
echo "预期退出代码 ${expected},实际为 ${status}" >&2
return 1
fi
}
# 模拟命令
mock_command() {
local cmd="$1"
local response="$2"
eval "${cmd}() { echo '${response}'; }"
export -f "${cmd}"
}
目标流程
- shell脚本开发
- CLI单元集成测试
- 跨平台CLI兼容性