SuperAPI AI 工具集

tdd-workflow

测试与质量

查看项目

更新于 10-15 08:15

技能介绍

用途

tdd-workflow 是一个面向 R 语言的测试驱动开发(TDD)工作流技能,使用 testthat 框架。它确保所有 R 代码开发遵循 TDD 原则,并具备全面的测试覆盖。当编写新函数或新功能、修复缺陷或问题、重构现有代码、添加新模型类型、创建数据处理管道、构建 Shiny 组件时,可以启用该技能。

主要能力

该技能围绕以下核心原则组织:

  • 测试先于代码:始终先写测试,再实现代码使测试通过。
  • 覆盖率要求:最低 80% 覆盖率(单元 + 集成);统计计算 100% 覆盖;数据验证 100% 覆盖;覆盖所有边界情况;测试错误场景。
  • 测试类型:测试遵循“文件 → 测试 → 断言”三级层次,包括单元测试、集成测试和快照测试。

单元测试针对单个函数与工具函数,例如 rescale01 的归一化与边界情况。集成测试验证函数交互与工作流,例如数据管道输出。快照测试用于难以明确指定的复杂输出,快照存放在 tests/testthat/_snaps/ 目录。

技能还提供可选的 BDD 写法,使用 describe() 和 it()。其关键区别是:“describe() 验证你实现了正确的东西,test_that() 确保你把东西做对。”

使用方式

初始化测试基础设施:

# Set up testthat (Edition 3)
usethis::use_testthat(3)

# Create a test file for an existing source file
usethis::use_test("function_name")

# Or create test and source file together
usethis::use_r("function_name")
usethis::use_test("function_name")

快照工作流:

# Review snapshot changes
testthat::snapshot_review("test_name")

# Accept snapshot changes
testthat::snapshot_accept("test_name")

开发期间优先使用 devtools::load_all() 而非 library(),它会暴露未导出函数供测试、自动附加 testthat、消除测试中不必要的 library() 调用,并在不安装的情况下模拟包加载。

TDD 工作流步骤:

  1. 定义预期行为(记录函数用途、输入、输出、边界情况)。
  2. 编写失败的测试。
  3. 运行测试(应当失败)。
  4. 实现最小代码。
  5. 再次运行测试。
  6. 重构(保持测试通过)。
  7. 验证覆盖率(covr::package_coverage())。

适用场景

适用于 R 包开发、统计计算函数、数据验证、数据转换与处理管道、模型拟合、Shiny 组件等需要测试保障的场景。技能给出了测试数据转换、统计函数、fixtures、模拟外部依赖、使用 withr 清理等测试模式。

限制与注意事项

技能强调测试设计原则:测试应自给自足、可独立运行;测试中允许重复而非提取;为失败做计划,在全新 R 会话中独立运行测试。

testthat Edition 3 提供改进的快照测试、基于 waldo 的更好差异、统一条件处理、并行执行支持,以及用于模拟的字节编译代码兼容性。需在 DESCRIPTION 中确保 Config/testthat/edition: 3。

已弃用模式与现代替代:context() 应移除(文件名已承担此作用);expect_equivalent() 改用 expect_equal(x, y, ignore_attr = TRUE);with_mock() 改用 local_mocked_bindings();expect_is() 改用 expect_s3_class()。

常见错误:不要测试实现细节而应测试行为;避免脆弱测试;避免依赖测试;测试失败时不要修改测试使其通过(除非测试本身有误),而应修复实现。

文件组织:测试镜像包结构,tests/testthat/ 下包含 test-.R(实际测试文件)、helper-.R(共享工具函数,测试运行前加载)、setup-*.R(仅在 R CMD check 时运行的设置代码)、fixtures/(静态测试数据,通过 test_path("fixtures/file") 访问)。

关于该技能的具体收费、价格、平台支持范围等信息,资料中暂未提供。