当条件不满足时跳过所有testthat测试

7
在使用testthat/devtools基础设施时,跳过R包测试目录中的所有测试的正确方法是什么?例如,如果没有与数据库的连接,并且所有测试都依赖于该连接,我是否需要在所有文件中单独编写一个skip,还是可以在某个地方编写一个单独的skip
我的标准软件包设置如下:
  • ... #其他软件包内容
  • tests/
    • testthat.R
    • testthat/
      • test-thing1.R
      • test-thing2.R
起初,我认为可以像这样在testthat.R文件中放置一个测试:
## in testthat.R
library(testthat)
library(mypackage)

fail_test <- function() FALSE
if (fail_test()) test_check("package")

但是,那么做并没有起作用,而且调用 devtools::test() 看起来会忽略该文件。我猜想另一种选择是将所有测试存储在另一个目录中,但是否有更好的解决方案呢?


在这个例子中,你需要 if( fail_test() ) ... - Thomas
2个回答

7
在R Packages书中,跳过测试一节涵盖了这种用例。基本上,您编写一个自定义函数来检查您需要检查的任何条件--无论您是否可以连接到数据库--然后从所有需要满足该条件的测试中调用该函数。
例如,从书中复制的示例:
skip_if_no_db <- function() {
  if (db_conn()) {
    skip("API not available")
  }
}

test_that("foo api returns bar when given baz", {
  skip_if_no_db()
  ...
})

我发现这种方法比单个开关关闭所有测试更有用,因为我倾向于同时拥有需要和不需要依赖于我正在检查的任何条件的测试混合,并且我希望尽可能运行尽可能多的测试。


你应该在所有测试中都放置它吗?有没有一种方法只在“顶层”运行它一次? - NelsonGon
更新链接:https://r-pkgs.org/testing-advanced.html#when-testing-gets-hard - user1582665

1
也许你可以在子目录中组织测试,将条件目录包含放在父文件夹test中:
考虑在testthat包中的“tests”。特别是,这个看起来很有趣: test-test_dir.r 包括“test_dir”子目录
我在这里没有看到递归测试扫描的内容: test_dir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接