R中的回归测试 - 如何针对测试而不是针对生产而不同地初始化我的包

时间:2017-03-09 11:09:20

标签: r caching configuration r-package testthat

详细地说,我编写了一个包(尚未发布),它使用memoise(https://github.com/hadley/memoise)来缓存基于持久互联网REST查询的结果。缓存的位置是包的配置选项(由配置文件或环境设置),并且在加载包时必须初始化缓存的函数。如果需要,应手动删除缓存,因为在线数据不会经常更新。

如何让我的测试使用与“普通”

不同的缓存区域
  • 以防止意外覆盖和

  • 通过始终以空缓存开始来使测试可重现?

思路:

  • 这个问题本来可以在testhat的某个地方解决,我太盲目无法找到它。

当然,从来没有不可能,在写这篇文章之前,我试着找几个小时的解决方案。我在stackoverflow上看到了一个关于数据库的类似问题 - 没有答案。

  • 如果包可以以某种方式检测到,如果它被加载到测试框架中,它可以使用临时目录进行缓存并忽略“正常”配置。

我找到的唯一方法是commandArgs()。这些可能会有所不同,具体取决于测试的运行方式(devtools,R CMD检查......),但它们总是与生产不同。不过,我必须知道所有可能/合理/通常的方法来运行测试。

  • 如果我可以在加载库之前在测试初始化​​期间调用函数,我可以模拟其他配置。

当使用 时,test目录中的test.hat文件不会始终使用?如果testthat.R文件,则如何完成包加载,例如由devtools?

经过一天的思考后编辑:

  1. 检测,如果从测试运行: 我提出以下代码来检测,如果代码当前正在测试(我不喜欢这个选项,因为测试不太有用,如果测试代码在测试中表现不同,请记住大众 - 柴油发动机):

    testing<-as.logical(any("devtools::test()" == commandArgs()))
    args = commandArgs()[grep("(^|/|\\|:|nextArg)PACKAGE_NAME.Rcheck(nextArg|$)", commandArgs(), perl = TRUE)]
    args2 = unlist(strsplit(args, "nextArg"))
    testing=as.logical(testing || (length(grep("(^|/|\\|:)PACKAGE_NAME.Rcheck$", args2)) > 0))
    
  2. ((用包裹名称替换PACKAGE_NAME))

    1. 解决问题: 在我的情况下,我看到我现在将选择的另一个选项,即使这不回答我的问题,我仍然感兴趣。而不是在测试中调用缓存状态相关的函数,我将有未缓存的版本的测试功能。对于生产,此版本随后由memoise封装。一个简单的平方函数的例子:

      # not exported
      .f <- function(x) {
        return(x*x);
      }
      
      # exported
      f <- memoise(.f, cache = c)
      
    2. 在测试中,我可以写:

      expect_equal(.f(2), 4);
      

      但是在制作中:

      four <- f(2)
      

      很抱歉打扰,没看到明显的,但是,你怎么处理这种情况?我知道with_mock,但对于包初始化步骤,这并不总是一个选项。

0 个答案:

没有答案