Agent Skills
› gnomeria/usbtree
› write-tests
write-tests
GitHub指导编写符合仓库风格的高效回归测试。匹配现有代码规范,按逻辑层级选择单元测试、冒烟或TUI测试,断言行为而非实现细节,确保测试独立且覆盖边界情况,最后运行并诚实报告结果。
触发场景
用户要求为函数/组件编写测试
添加测试覆盖率
功能实现后缺乏测试
安装
npx skills add gnomeria/usbtree --skill write-tests -g -y
SKILL.md
Frontmatter
{
"name": "write-tests",
"description": "Author tests that match the repo's stack and existing test style, at the cheapest level that catches the regression. Use when the user says \"write tests for\", \"add test coverage\", \"test this function\/handler\/component\", \"this needs tests\", or after implementing a feature that lacks tests."
}
Write Tests
Test fails when behavior breaks, passes when it doesn't — nothing more. Run at end, report honestly.
Step 1 — Match repo style
- Tests live in-file:
#[cfg(test)] mod testsat bottom,use super::*. - Builder helpers for fat structs (see
dev()insrc/usb.rstests) — reuse existing helper, extend it, don't build parallel one. - Plain
assert_eq!/assert!. No assertion crates, no mock frameworks. - Raw descriptor bytes: inline arrays with
#[rustfmt::skip]+ comment per chunk (existing pattern).
Step 2 — Choose level
Cheapest level that catches the regression:
- Unit
#[test]— pure logic: tree flatten/fold, parsing (usb.ids, sysfs values, descriptors), diff. Default. No hardware, no I/O. - Smoke —
./target/release/usbtree --demo --dump: exercises scan→tree→render path, no hardware. For wiring bugs, not logic bugs. - TUI in pty —
--demoin pty for interaction (keys, fold, filter). Manual/scripted, last resort — most TUI logic is testable as pure functions on App state; prefer extracting that.
Pure parse bug tested through pty = wrong. Keybinding wiring tested as unit = also wrong. Match level to where bug lives.
Step 3 — Write
- Behavior, not implementation. Assert outputs and state, not internals.
- Name by behavior:
max_power_parses_sysfs,filter_finds_devices_in_collapsed_hubs— nottest1. - Independent tests: own data, no ordering deps. No shared mutable state — tests run parallel by default.
- Filesystem cases:
tempfile::TempDirif already a dep, else skip fs test and test the parse fn on a&strinstead — push I/O to edge, test the pure part. - Cover happy path, interesting failures (malformed input, missing sysfs file, truncated descriptor), boundary values. Skip permutations hitting same branch.
- Don't test nusb/ratatui — test your use of them.
Step 4 — Run and report
cargo test name_fragmentfirst, then fullcargo test.- Report pass/fail, verbatim output for red.
- Test caught real bug in code under test → fix code (or flag), never the test.
- Never weaken assertion or skip to get green. Never report green without running.
版本历史
-
171c884
当前 2026-07-19 10:05
重写技能以适配 Rust 语言栈,移除对 Go/JS 生态的支持,新增 CI 和知识图谱相关说明。
- 9a316d8 2026-07-11 17:01


