7

我刚刚开始使用 R 进行单元测试,并且发现到目前为止它很难进行。我想做的是进入 R 控制台,输入test()并让 testthat 运行我的 R 包中的所有文件的测试。

这是我的环境:

sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin15.2.0 (64-bit)
Running under: OS X 10.11.4 (El Capitan)

和目录结构:

math
-- R
------ math.R
------ add.R 
------ subtract.R
-- tests
------ testthat.R 
------ testthat
---------- test_add.R
---------- test_subtract.R
---------- test_math.R

带有以下相关文件的样本:

数学.R

source('add.R')
source('subtract.R')

doubleAdd <- function(x){
    return(add(x,x) + add(x,x))
}

添加.R

add <- function(a,b){
    return(a + b)
}

测试那个.R

library(testthat)
library(math)

test_check("math")

test_add.R

context('add tests')

test_that('1 + 1 = 2', {
    expect_equal(2, add(1,1))
})

错误:

在 R 控制台中,我得到以下结果:

library(devtools)
test()
<b>Loading math
Loading required package: testthat
Error in file(filename, "r", encoding = encoding) (from math.R#1) : 
  cannot open the connection
In addition: Warning message:
In file(filename, "r", encoding = encoding) :
  cannot open file 'add.R': No such file or directory
</b>

但是,如果我切换工作目录setwd('R')并运行 math.R,doubleAdd功能就很好。此外,如果我删除 math.R 或将 math.R 从“R”目录中移出,test()也可以正常工作。

我应该如何设置这些文件来test()为我的所有 R 文件运行测试?

4

1 回答 1

3

如果你正在构建一个你不应该使用的包source。您只需将函数导出到NAMESPACE文件中或使用roxygen为您完成。您可能会收到错误,因为它正在寻找add.R您的工作目录。

对于我来说,这是一个从头开始的基本包设置。

add.R - 在 R/ 目录中

#' @export
add <- function(a,b){
  return(a + b)
}

test_add.R - 在 tests/testthat/ 目录中

context('add tests')

test_that('1 + 1 = 2', {
  expect_equal(2, add(1,1))
})

在控制台中运行

library(devtools)
# setup testing framework
use_testthat()

# update NAMESPACE and other docs
document()

# run tests
test()

Loading math
Loading required package: testthat
Testing math
add tests : .

DONE 

注意- 你实际上甚至不需要 export add。如果它是您正在测试的内部功能,它仍然可以工作。只需停止source在您的包装中使用。

于 2016-03-25T18:33:39.853 回答