首页 > 解决方案 > testhat - 如何存储预期结果?

问题描述

假设我想使用包为以下函数编写单元测试testthat

make_matrix = function(vec) {
    matrix(vec, nrow=2)
}

预期的功能如下:

make_matrix(seq(1:4))
     [,1] [,2]
[1,]    1    3
[2,]    2    4

按照关于 SO 的建议,我将把测试函数的输入存储在inst/testdata 我应该在哪里使用 testthat 为自动化测试放置数据?

#input = system.file("testdata/input.rds, package "my_package")
input = seq(1:4)

# expected_output_for_seq_1_4 = readRDS()/system.file()?
expected_output_for_seq_1_4 = matrix(c(1,2,3,4), nrow=2)

test_that("basic_test", {
    expect_equal(make_matrix(input), expected_output_for_seq_1_4)
})

但是我应该在哪里以及如何存储预期的输出?也在inst/testdata? 给定一个更复杂的函数,取决于函数的参数,单个输入可能会有许多预期输出

标签: rtestthat

解决方案


我想出了两个选择:

选项 1:Rdata文件位于inst/testdata

根据链接问题中最被接受的答案,我会将其保存在 中inst/testdata,但使用允许将多个对象保存在一个文件中的 RData 文件。这样,您可以将相关测试的所有预期输出保存在同一个文件中:

inst/testdata/expected_outputs_function1.Rdata # contains all the outputs for function1
inst/testdata/expected_outputs_function2.Rdata # contains all the outputs for function2

选项 2:R 文件即时生成输出

但是,如果项目/包很复杂,或者需要大的预期输出,则前面的方法可以生成超出CRAN 包大小策略的 RData文件(仅当您要将包上传到 CRAN 时才相关)。因此,其他选项是将生成预期输出的代码存储在并在执行测试之前inst/testdata/expected_outputs.R添加 :source(system.file("testdata/expected_outputs.R", package "my_package"))

预期输出.R

expected_output_for_seq_1_4 <- matrix(c(1,2,3,4), nrow=2)
expected_output_for_data_frame <- {code to generate output for data_frame here}
{...}

这种方法的缺点是,如果预期的输出需要很长时间来计算,测试就不会很快。


推荐阅读