You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用testthat编写单元测试:如何存储预期测试结果?

完全没问题——预期输出绝对可以和测试输入一起放在inst/testdata目录下,这是R包开发里测试数据管理的标准操作,testthat和整个devtools生态都对这种方式有很好的支持。

1. 简单场景:硬编码还是存文件?

对于你例子里这种简单的预期输出(小矩阵),直接在测试脚本里硬编码完全OK,就像你现在写的那样——代码直观,不需要额外的文件读取步骤。但如果你的预期输出是大型对象(比如几万行的数据框、训练好的模型对象),或者需要和测试输入一一对应管理,把预期输出存成.rds(推荐,因为能完整保存R对象的所有结构)、.csv等格式放在inst/testdata会更合理。

比如把你的预期矩阵存成expected_seq1-4.rds,测试代码可以写成:

test_that("basic_test", {
  # 读取测试输入
  input <- readRDS(system.file("testdata/input_seq1-4.rds", package = "my_package"))
  # 读取对应预期输出
  expected <- readRDS(system.file("testdata/expected_seq1-4.rds", package = "my_package"))
  # 执行断言
  expect_equal(make_matrix(input), expected)
})

2. 复杂场景:单个输入对应多组预期输出

如果你的函数逻辑更复杂,同一输入需要对应不同依赖参数的预期输出,有几种实用的处理方式:

  • 按参数组合命名文件:给文件加清晰的后缀标识参数,比如输入是seq(1:4),对应nrow=2和nrow=3的预期输出,可以命名为expected_seq1-4_nrow2.rds和expected_seq1-4_nrow3.rds。测试时根据当前用例的参数读取对应文件即可。
  • 打包成列表存单个文件:把同一输入对应的所有预期输出放到一个命名列表里,先在本地生成并保存:
    # 本地生成多组预期输出并保存
    expected_list <- list(
      nrow2 = matrix(c(1,2,3,4), nrow=2),
      nrow3 = matrix(c(1,2,3,4), nrow=3)
    )
    saveRDS(expected_list, "inst/testdata/expected_seq1-4_multiple.rds")
    
    测试时读取这个列表,按参数名提取对应值:
    test_that("test with varying nrow parameters", {
      input <- readRDS(system.file("testdata/input_seq1-4.rds", package = "my_package"))
      expected_list <- readRDS(system.file("testdata/expected_seq1-4_multiple.rds", package = "my_package"))
      
      expect_equal(make_matrix_custom(input, nrow=2), expected_list$nrow2)
      expect_equal(make_matrix_custom(input, nrow=3), expected_list$nrow3)
    })
    
  • 用结构化文件存储多组数据:如果预期输出是表格类数据,且参数组合很多,可以用CSV/TSV文件,第一列存参数标识,后面是数据列。测试时读取后筛选对应参数的行,再转换成你需要的对象格式。

总的来说,inst/testdata是存放所有测试相关数据(输入、预期输出、辅助数据)的标准位置,怎么组织完全看你的测试复杂度——简单场景硬编码更直观,复杂场景用文件分组管理更清晰。

内容的提问来源于stack exchange,提问作者MrNetherlands

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:44:13