首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳过CRAN的测试,但在本地运行。

跳过CRAN的测试,但在本地运行。
EN

Stack Overflow用户
提问于 2016-03-22 22:16:22
回答 2查看 1.8K关注 0票数 11

如果包是由CRAN测试的,那么有一种简单的方法可以跳过包中某些测试的执行吗?背景是,我喜欢有很多的测试,总之,它们是耗时的(对CRAN不好)。

我知道存在testthat::skip_on_cran(),但我不想使用包testthat来避免另一个依赖项。我正在寻找一种模仿testthat::skip_on_cran的el方式。

理想情况下,我希望在目录pkg/tests中有一个testfile来调用测试(Testfile),如果我们在cran上或者不使用cran的话,可以使用distuingishes:

代码语言:javascript
复制
if (!on_cran) {
 ## these tests are run only locally/when not on CRAN
 # run test 1 (e.g. source a file with a test)
 # run test 2
}
# run test 3 - always
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-25 13:47:15

是!您可以以编程方式自动处理此问题。让我详细说明我设置的两种方式:

隐式地通过版本号:这是Rcpp多年来采用的方法,它完全是通用的,不依赖于任何其他包。我们的测试从tests/中的一个文件开始,然后交给RUnit,但最后一部分是实现细节。

在主文件tests/doRUnit.R中,我们这样做:

代码语言:javascript
复制
## force tests to be executed if in dev release which we define as
## having a sub-release, eg 0.9.15.5 is one whereas 0.9.16 is not
if (length(strsplit(packageDescription("Rcpp")$Version, "\\.")[[1]]) > 3) { 
    Sys.setenv("RunAllRcppTests"="yes")
}

本质上,我们测试版本是否为a.b.c.d格式--如果是这样的话,我们可以得出结论,它是一个开发版本。这意味着“运行所有测试”。而表格a.b.c的发布版本将转到CRAN,而不运行这些测试,因为它们将超过它们的时间限制。

然后,在每个实际单元测试文件中,我们可以决定是否要执行变量,如果设置了测试,则跳过测试,或者无论如何执行:

代码语言:javascript
复制
.runThisTest <- Sys.getenv("RunAllRcppTests") == "yes"

if (.runThisTest) {

   ## code here that contains the tests

}

这种机制是完全自动的,不依赖于用户。(在实际的包版本中,有另一个if ()测试包装在里面,它允许我们抑制测试,但这是我们不需要的细节)。

我还是很喜欢这种方法。

通过资源文件显式地使用,我们中的一些人使用的另一个包(最近很多)需要一个特定的后端才能使用。因此,在Rblpapi包中,为了设置凭据和连接细节,我们测试是否存在我和我的合作作者和我各自在$HOME目录下的一个文件。如果文件丢失了--比如在Travis CI上,或者CRAN上,或者对于其他用户,测试就会被跳过。

我们选择使用资源文件作为R文件;它是options()。这样我们就可以直接控制是否启动测试。

代码语言:javascript
复制
## We need to source an extra parameter file to support a Bloomberg connection
## For live sessions, we use ~/.Rprofile but that file is not read by R CMD check
## The file basically just calls options() and sets options as needed for blpHost,
## blpPort, blpAutoConnect (to ensure blpConnect() is called on package load) and,
## as tested for below, blpUnitTests.
connectionParameterFile <- "~/.R/rblpapiOptions.R"
if (file.exists(connectionParameterFile)) source(connectionParameterFile)

## if an option is set, we run tests. otherwise we don't.
## recall that we DO need a working Bloomberg connection...
if (getOption("blpUnitTests", FALSE)) {
  
    ## ... more stuff here which sets things up

}

类似于第一个用例,我们现在可以设置更多的变量,然后进行测试。

我们在rfoaas中使用的另一个选项通过Travis CI显式地设置环境变量,以在Travis CI文件中控制这一点。

代码语言:javascript
复制
env:
  global:
    - RunFOAASTests=yes

哪个测试脚本然后拾取

代码语言:javascript
复制
## Use the Travis / GitHub integrations as we set this
## environment variable to "yes" in .travis.yml
##
## Set this variable manually if you want to run the tests
##
if (Sys.getenv("RunFOAASTests=yes") == "yes") runTests <- TRUE

在这种情况下,我还根据自己的userid设置切换,因为我几乎是该项目的唯一贡献者:

代码语言:javascript
复制
## Also run the tests when building on Dirk's box, even whem
## the environment variable is not set
if (isTRUE(unname(Sys.info()["user"])=="edd")) runTests <- TRUE

通过另一个变量显式地使用,当然,您也可以依赖在所有包中使用的另一个变量。我觉得这是个坏主意。如果你在你的shell中设置它,在包A上工作,并将它设置为抑制测试,然后切换到包B--你可能会忘记取消变量设置,然后失败测试。我最不喜欢这种方法,也不使用它。

票数 23
EN

Stack Overflow用户

发布于 2016-03-22 22:19:00

使用环境变量就像测试一样

代码语言:javascript
复制
skip_on_cran <- function() {
  if (identical(Sys.getenv("NOT_CRAN"), "true")) {
    return(invisible(TRUE))
  }

  skip("On CRAN")
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36166288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档