Bro*_*ieG 2 r testthat unitizer
是否有一个简单的工作流来编写将对象存储为.rds或.rda的测试,以便将来运行的测试可以比较代码执行的结果与存储的对象?这样可以很容易地检查返回有些复杂值的函数是否仍然按预期运行.
例如,类似于:
test_obj(res <- lm(y ~ x, data.frame(x=1:3, y=5:7)))
Run Code Online (Sandbox Code Playgroud)
如果*extdata/test_obj.res.rds*不存在,将在*inst/extdata/test_obj.res.rds*中创建它,res从上面开始,但如果确实存在,则会相同/ all.equal等新生成的对象与从rds中恢复的对象.
我会发现这样的测试超级有用,我有点惊讶RUnit/svUnit/test没有实现某种类型的东西(我希望他们这样做,我只是没有找到它).
testthat::make_expectation是接近,但我更喜欢有自动存储/检索rds,而不是将文本表示复制粘贴到文件,我认为你应该如何使用testthat::make_expectation(我想我可以管道stdout()到一个. R文件,但即使这样,也有一些自动化可以促进这个过程).
它花了我三年时间,但我写信unitizer来解决这个问题.它是一个单元测试框架,具有交互式UI,允许您查看测试输出并通过单次击键存储/拒绝它.它还通过向您显示正确的失败测试差异,并将您放入这些测试评估环境以便在交互式UI中进行调试,从而简化了更新/测试/调试周期.
例如,如果我们有一个矩阵旋转函数(由@MatthewLundberg提供)我们想测试:
# mx-rotate.R
rotate <- function(x) t(apply(x, 2, rev))
Run Code Online (Sandbox Code Playgroud)
还有一些带有一些测试的脚本:
# mx-test.R
mx <- matrix(1:9, 3)
rotate(mx)
rotate(rotate(mx))
rotate(rotate(rotate(mx)))
Run Code Online (Sandbox Code Playgroud)
然后:
library(unitizer)
unitize('mx-test.R')
Run Code Online (Sandbox Code Playgroud)
将启动一个交互式会话,允许您查看三个轮换调用的结果,并接受它们作为测试,如果它们按预期工作.
有一个截屏演示可用.