test在devtools :: check中失败但在devtools :: test

时间:2017-01-25 08:15:38

标签: r devtools testthat

有没有办法重现devtools::check使用的环境?

我遇到的问题是我的测试与devtools::test()一起使用但在devtools::check()内失败。我的问题是现在,如何找到问题。 check的报告只打印错误日志的最后几行,我找不到完整的测试报告。

checking tests ... ERROR
Running the tests in ‘tests/testthat.R’ failed.
Last 13 lines of output:
...

我知道check使用与test相比不同的环境,但我不知道如何调试这些问题,因为它们根本不可重现。特别是这些测试在几个月前运行,所以不知道在哪里寻找问题。

编辑

实际上我试图找到我的问题并找到了解决方案。但要发布我的解决方案,我必须添加更多细节。

所以我的测试总是失败,因为我测试了markdown脚本,如果它运行没有错误,之后我检查是否正确设置了一些环境变量。这些是我用脚本计算的结果以及我设置的标准设置。因此,如果我在开发后忘记更改某些设置,我想收到警告......

无论如何,由于它是一个降价脚本,我不得不提取代码,我使用knitr: run all chunks in an Rmarkdown document使用knitr::purl来获取代码并使用sys.source来执行它

runAllChunks <- function(rmd, envir=globalenv()){
  # as found here https://stackoverflow.com/questions/24753969
  tempR <- tempfile(tmpdir = '.', fileext = ".R")
  on.exit(unlink(tempR))
  knitr::purl(rmd, output=tempR, quiet=TRUE)
  sys.source(tempR, envir=envir)
}

出于某种原因,这可能会产生错误,因为可能需要几周时间(不确定我最近安装了哪些新软件包...... )。但是由于有一个新的评论,我可以使用knitr::knit同时执行代码,这按预期工作,现在我的测试不再抱怨了。

所以最后,我不知道问题究竟在哪里,但现在正在发挥作用。

5 个答案:

答案 0 :(得分:1)

这是一个带有testthat的known issue。解决方法是将以下内容添加为tests/testthat.R中的第1行:

Sys.setenv(R_TESTS="")

答案 1 :(得分:1)

我最近遇到了与我的测试中断类似的问题(成功devtools::test()但未成功devtools::check())。我不知道这个解决方案是否必然能解决上述问题,但它应该有助于追踪类似的问题。

在我的情况下,问题最终归结为使用需要Suggests而不是Imports / Depends中列出的软件包的函数。 In特别是,我的函数名为httr::content(),当我试图传递as = "parsed"参数时它就破了。事实证明,as = "parsed"使用建议的包readr来读取csv,我需要将其添加到devtools::check()的依赖项中才能正常工作。

答案 2 :(得分:0)

正如我上面提到的,我将部分代码更改为不再是用户knitr::purl,而是使用knitr::knit,这解决了我的问题。

expect_error(f <- runAllChunks('010_main_lfq_analysis.Rmd'), NA)
expect_error(f <- knitr::knit('010_main_lfq_analysis.Rmd', output='jnk.R', quiet=TRUE, envir=globalenv()), NA)

答案 3 :(得分:0)

万一它对别人有帮助,这就是对我有用的

  1. 重新安装所有相关软件包。例如。 install.packages("testthat", "dplyr", "lubridate", "stringr")(我包括了我的包裹使用的所有包裹)
  2. 关闭RStudio并重新打开

然后所有测试通过

答案 4 :(得分:0)

在以下情况下也可能发生这种情况:您已经在# This program asks for an input and output file, and uses mult. and add. # to combine files def main(): print("This program creates a file of numbers from a") print("file of numbers.") infileName = input("What file are the numbers in? ") outfileName = input("What file should the numbers go in? ") infile = open(infileName, 'r') outfile = open(outfileName, 'w') for line in infile: nums = line.split() nums = float() first = nums[0] second = nums[-1] newfirst = (first + second) newsecond = (first * second) print(newfirst, newsecond, file=outfile) infile.close() outfile.close() print("Numbers have been written to", outfileName) main() 中加载了一个库,并且您引用的是该库中没有命名空间绑定的函数。例如,假设您在测试文件中使用了R中的nnzero()函数,并且碰巧还已经为Matrix加载了Matrix软件包。然后library(Matrix)将通过,但devtools::test()将失败。使用devtools::check()应该可以解决问题。