使用 testthat 在单元测试中重用变量。是不是有一种可接受的做法来避免重新创建计算量大的变量

Posted

技术标签:

【中文标题】使用 testthat 在单元测试中重用变量。是不是有一种可接受的做法来避免重新创建计算量大的变量【英文标题】:Reusing variables across unit tests with testthat. Is there an acceptable practice to avoid recreating computationally expensive variables使用 testthat 在单元测试中重用变量。是否有一种可接受的做法来避免重新创建计算量大的变量 【发布时间】:2021-11-04 23:00:39 【问题描述】:

我正在创建一个 R 包,其中我有一个创建对象的函数和一个基于该对象制作绘图的函数。

例子:

objA <- create_obj(sample)
plot_obj(objA)

我对第一个函数进行了一些测试(使用 testthat),例如:

objA <- create_obj(sample)
expect_value(length(objA), 10)

现在我想测试plot_obj()。我需要一个对象来测试它,但是创建一个新的 objA 很耗时(几秒钟)。

在第一次测试通过后,我可以让其他测试(在其他文件中)访问 objA,这样我就可以使用它来测试 plot_obj() 而无需重新创建它?

(我想我可以将objA &lt;- create_obj(sample) 放在 setup.R 中,但我会在测试之前使用该函数)。

【问题讨论】:

是否可以选择使用usethis::use_data(objA) 创建.rdaobjA 文件,然后将其驻留在包的data 文件夹中,然后您可以轻松地使用它测试和示例? 这样的问题是,如果create_obj() 发生变化,因此它与plot_obj() 不兼容,我对plot_obj() 的测试不会失败,因为它使用了objA 的存储版本。跨度> 确实如此。解决方法 1:您可以设置一个 data-raw 脚本,该脚本基于 create_obj() 创建 objA。我不确定这是否可以自动化,每次更改后手动重新运行该脚本绝对不是您想要的。解决方法 2:在您的包中创建一个未导出的对象 objA。如果你更新create_obj()objA也会更新。 创建一个未导出的对象并将objA &lt;- create_obj(sample)放入tests/testthat/setup.R会有什么好处吗? 【参考方案1】:

这是我目前确定的解决方法:

在“tests/testthat/setup.R”中:

try(
    objA <- create_obj(sample)
, silent = TRUE)

这样,如果create_obj(sample) 崩溃,我仍然会运行我的测试。我仍然创建了两次objA:一次在设置中,一次在create_obj 的单元测试中。

【讨论】:

以上是关于使用 testthat 在单元测试中重用变量。是不是有一种可接受的做法来避免重新创建计算量大的变量的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 testthat 包中的函数来测试向量的元素吗?

如何编写测试用例以使用r中的testthat检查函数是否正常工作?

如何将 testthat 测试应用于我的包中与特定命名模式匹配的所有函数?

UITableViewCell 中具有第一响应者状态的 UITextField 是不是会阻止单元格重用?

检查重用单元格的图像是不是为空

SpecFlow - 是不是可以在功能文件中重用测试数据?