plugins/languages/bash/skills/testing/SKILL.md
Bash testing conventions using bats-core (Bash Automated Testing System): test layout, setup/teardown, run/assert helpers, bats-assert / bats-file / bats-support libraries, mocking commands via PATH override, coverage with kcov, and CI integration. Use when designing test suites for shell scripts, validating CLI behavior, or hardening release scripts. Triggers on "bats 测试", "shell 单元测试", "bats-core", "kcov bash", "shell 脚本测试", "mock command".
npx skillsauth add lazygophers/ccplugin bash-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| 工具 | 用途 | 最低版本 | |------|------|---------| | bats-core | 测试框架 | 1.11+ | | bats-assert | 断言库 | latest | | bats-support | 错误输出支撑 | latest | | bats-file | 文件断言 | latest | | kcov | 行覆盖率 | 42+ | | shellcheck | 静态检查 | 0.10+ | | shfmt | 格式化 | 3.8+ |
project/
├── bin/myscript
├── lib/
│ ├── util.sh
│ └── parser.sh
├── tests/
│ ├── test_helper/
│ │ ├── bats-support/
│ │ ├── bats-assert/
│ │ └── bats-file/
│ ├── common.bash # 共享 helper
│ ├── unit/
│ │ ├── util.bats
│ │ └── parser.bats
│ └── integration/
│ └── cli.bats
└── .bats.yaml
#!/usr/bin/env bats
# tests/unit/parser.bats
load '../common' # 加载共享 helper(无扩展名)
setup() {
load 'test_helper/bats-support/load'
load 'test_helper/bats-assert/load'
load 'test_helper/bats-file/load'
# 项目根入 PATH
PROJECT_ROOT="$(cd "${BATS_TEST_DIRNAME}/../.." && pwd)"
PATH="${PROJECT_ROOT}/bin:${PATH}"
# 隔离 HOME / 临时目录
TMPDIR="$(mktemp -d)"
export TMPDIR
}
teardown() {
[[ -d "${TMPDIR}" ]] && rm -rf -- "${TMPDIR}"
}
@test "parse_count: numeric input" {
run parse_count "42"
assert_success
assert_output "42"
}
@test "parse_count: rejects non-numeric" {
run parse_count "abc"
assert_failure
assert_output --partial "invalid"
}
@test "myscript --help shows usage" {
run myscript --help
assert_success
assert_line --index 0 "Usage: myscript [options]"
}
@test "creates output file" {
run myscript --out "${TMPDIR}/out.txt"
assert_success
assert_file_exist "${TMPDIR}/out.txt"
assert_file_contains "${TMPDIR}/out.txt" "done"
}
# run 捕获 stdout/stderr/status
run command args
# $output — 合并 stdout+stderr
# $status — 退出码
# ${lines[@]} — output 按行
# $stderr / $stdout(bats 1.10+: run --separate-stderr)
run --separate-stderr myscript --bad-flag
assert_failure 2
assert_equal "$stderr" "error: bad flag"
常用断言(bats-assert):
assert_success
assert_failure [exit_code]
assert_output "exact"
assert_output --partial "substr"
assert_output --regexp '^[0-9]+$'
assert_line --index 0 "first line"
refute_output "bad"
assert_equal "$actual" "$expected"
# 在 PATH 前置目录放伪装可执行文件
setup() {
MOCK_BIN="$(mktemp -d)"
PATH="${MOCK_BIN}:${PATH}"
cat >"${MOCK_BIN}/curl" <<'EOF'
#!/usr/bin/env bash
echo '{"status":"ok"}'
exit 0
EOF
chmod +x "${MOCK_BIN}/curl"
}
@test "fetches data via curl" {
run fetch_status
assert_success
assert_output --partial "ok"
}
kcov \
--include-pattern=.sh,/bin/myscript \
--exclude-pattern=tests/ \
coverage \
bats tests/
# 打开 coverage/index.html 查看
name: bash-test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: install tools
run: |
sudo apt-get update
sudo apt-get install -y bats shellcheck shfmt kcov
- name: shellcheck
run: shellcheck bin/* lib/*.sh
- name: shfmt
run: shfmt -d -i 4 -ci bin/ lib/
- name: bats
run: bats --recursive tests/
- name: coverage
run: kcov --include-pattern=.sh coverage bats tests/
TMPDIR、HOME、PATH;teardown 清理。bats-assert 而非 [[ $output == ... ]]。trap 清理、信号处理。tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。