【问题标题】:testhat - how to store expected result?testhat - 如何存储预期结果?
【发布时间】:2020-03-14 21:18:03
【问题描述】:

假设我想使用包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 Where should I put data for automated tests with 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?给定一个更复杂的函数,取决于函数的参数,单个输入可能会有许多预期输出

【问题讨论】:

    标签: r testthat


    【解决方案1】:

    我想出了两个选择:

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

    根据linked question 中最被接受的答案,我会将其保存在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 文件

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

    expected_outputs.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}
    {...}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多