2

是否有一个简单的工作流程来编写将对象存储为 .rds 或 .rda 的测试,以便将来运行测试可以比较代码执行的结果与存储的对象?这样可以很容易地检查返回一些复杂值的函数是否仍按应有的方式运行。

例如,类似:

test_obj(res <- lm(y ~ x, data.frame(x=1:3, y=5:7)))

其中,如果 *extdata/test_obj.res.rds* 不存在,将在 *inst/extdata/test_obj.res.rds* 中创建它,res从上面开始,但如果它确实存在,将相同/all.equal 等. 新生成的对象与从 rds 中恢复的对象。

我会发现这样的测试非常有用,我有点惊讶 RUnit/svUnit / testthat 没有实现某种东西(我希望他们这样做,但我还没有找到它)。

testthat::make_expectation很接近,但我更喜欢自动存储/检索 rds 而不是将文本表示复制粘贴到文件中,我认为这是你应该使用的方式testthat::make_expectation(我想我可以通过管道将 stdout() 传输到 . R 文件,但即便如此,仍有一些自动化可以促进该过程)。

4

2 回答 2

6

我只花了三年时间,但我写信unitizer来解决这个问题。它是一个具有交互式 UI 的单元测试框架,允许您通过单次击键查看测试输出并存储/拒绝它。它还通过向您显示失败测试的正确差异,并让您进入这些测试评估环境以在交互式 UI 中进行调试,从而简化更新/测试/调试周期。

例如,如果我们有一个矩阵旋转函数(@MatthewLundberg 提供),我们想要测试:

# mx-rotate.R

rotate <- function(x) t(apply(x, 2, rev))

还有一个带有一些测试的脚本:

# mx-test.R

mx <- matrix(1:9, 3)
rotate(mx)
rotate(rotate(mx))
rotate(rotate(rotate(mx)))

然后:

library(unitizer)
unitize('mx-test.R')

将启动一个交互式会话,允许您查看三个轮换调用的结果,如果它们按预期工作,则接受它们作为测试。

有一个可用的截屏演示。

于 2017-04-11T15:17:14.917 回答
2

截至 2017 年,testthat具有功能expect_equal_to_reference,这正是问题所要求的。我猜哈德利 W. 想出了一个办法。

于 2017-03-28T23:10:45.907 回答