用途
CLI Testing Patterns 是一套面向命令行应用(CLI)的测试策略与模式集合,旨在为 Node.js 和 Python 项目提供统一的 CLI 测试方法。它适用于编写 CLI 工具测试、验证命令执行、测试退出码等场景。
主要能力
该技能覆盖以下测试领域:
- 命令执行测试:使用不同参数组合执行 CLI 命令并验证行为。
- 退出码校验:验证成功(0)与失败(非零)情况下的退出码。
- 输出验证:分别检查 stdout 与 stderr 的内容。
- 交互式提示测试:通过模拟输入测试交互式提示。
- 集成测试:验证多命令的完整工作流。
- 配置文件处理测试。
Node.js 测试
使用 Jest 测试 CLI 命令,导入 child_process.execSync 执行命令,创建辅助函数运行 CLI 并捕获输出,分别测试退出码、stdout、stderr,并处理成功与错误两种情况。
测试结构:设置相对于测试位置的 CLI 路径;创建返回 {stdout, stderr, code} 的 runCLI() 辅助函数;使用 try-catch 处理非零退出码;测试常见场景如版本、帮助、未知命令。
Python 测试
使用 pytest 配合 Click.testing.CliRunner,从 click.testing 导入 CliRunner,创建可复用的 runner fixture,通过 runner.invoke(cli, ['args']) 调用命令,检查 result.exit_code 和 result.output。
测试结构:为 CliRunner 实例创建 pytest fixture;使用 runner.invoke() 执行 CLI 命令;通过 result 对象访问结果;使用 input='responses\n' 模拟交互式输入。
退出码测试模式
标准退出码:
- 0 - 成功
- 1 - 一般错误
- 2 - 命令误用(无效参数)
- 126 - 命令无法执行
- 127 - 命令未找到
- 128+N - 致命错误信号 N
测试策略:始终测试成功(0)和失败(非零)两种情况;针对不同错误条件验证特定退出码;测试参数校验返回适当的退出码;确保帮助/版本返回 0(成功)。
输出验证模式
内容测试:检查输出中关键文本是否存在;验证格式(JSON、YAML、表格);测试颜色/格式代码(如适用);验证错误消息是否对用户友好。
最佳实践:使用 .toContain() 进行灵活匹配(Jest);在 Python 测试中使用 in result.output;测试正向和负向两种情况;验证完整工作流(多命令)。
模板与脚本
模板包括:Node.js/Jest 模板(jest-cli-test.ts、jest-config-test.ts、jest-integration-test.ts)、Python/Pytest 模板(pytest-click-test.py、pytest-fixtures.py、pytest-integration-test.py)、测试工具(test-helpers.ts、test-helpers.py)。
脚本包括:setup-jest-testing.sh(安装 Jest 并配置 CLI 测试)、setup-pytest-testing.sh(安装 pytest 和 Click 测试依赖)、run-cli-tests.sh(执行所有 CLI 测试并生成覆盖率)、validate-test-coverage.sh(检查测试覆盖率阈值)。
示例目录:examples/jest-basic/、examples/jest-advanced/、examples/pytest-click/、examples/integration-testing/、examples/exit-code-testing/。
环境要求
Node.js 测试:Jest 29.x 或更高版本;TypeScript 支持(ts-jest);Node.js 16+。
Python 测试:pytest 7.x 或更高版本;Click 8.x 或更高版本;Python 3.8+。
两者共同要求:测试覆盖率报告工具;CI/CD 集成支持;外部依赖的 Mock/Stub 能力。
最佳实践
- 隔离测试:每个测试应独立。
- Mock 外部依赖:不要进行真实 API 调用或文件系统更改。
- 测试错误路径:像测试成功一样彻底地测试失败。
- 使用 Fixtures:在测试间共享设置代码。
- 清晰的测试名称:命名测试以描述其验证内容。
- 快速执行:保持测试快速以获得快速反馈。
- 覆盖率目标:争取 80%+ 代码覆盖率。
- 集成测试:测试完整工作流,而不仅仅是单元。
适用场景与限制
适用场景:为 CLI 工具编写测试、验证命令执行、测试退出码。
限制:该技能主要面向 Node.js 和 Python 生态,其他语言或框架的 CLI 测试暂未提供支持。具体收费、价格、平台等信息暂未提供。