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

pic*_*ick 6 r devtools package testthat

使用testthat/devtools基础结构时,跳过R包测试目录中所有测试的正确方法是什么?例如,如果没有与数据库的连接并且所有测试都依赖于该连接,我是否需要skip单独编写所有文件或者我可以在skip某处写一个?

我有一个标准的包装设置,看起来像

mypackage的/

  • ......#其他包裹的东西
  • 测试/
    • testthat.R
    • testthat /
      • 测试thing1.R
      • 测试thing2.R

起初我以为我可以在testthat.R文件中进行测试

## in testthat.R
library(testthat)
library(mypackage)

fail_test <- function() FALSE
if (fail_test()) test_check("package")
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,看起来调用devtools::test()只是忽略该文件.我想另一种方法是将所有测试存储在另一个目录中,但是有更好的解决方案吗?

Dyl*_*lan 5

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()
  ...
})
Run Code Online (Sandbox Code Playgroud)

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


小智 1

也许您可以在子目录中组织测试,将条件目录包含放在父文件夹测试中:

考虑testthat包中的“测试” 。特别是,这个看起来很有趣:

我在这里没有看到任何在测试扫描中递归子目录的内容: