使用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
相关产品推荐
相关产品推荐

