如何使用 R 的 testthat 对单个文件进行单元测试?
How to use R's testthat to unit test individual files?
我刚刚开始使用 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
附相关文件样本如下:
math.R
source('add.R')
source('subtract.R')
doubleAdd <- function(x){
return(add(x,x) + add(x,x))
}
add.R
add <- function(a,b){
return(a + b)
}
testthat.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()
工作正常。
我应该如何设置这些文件以对我的所有 R 文件进行 test()
运行 测试?
如果您正在构建一个包,则不应使用 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
注意 - 实际上你甚至不需要导出 add
。如果它是您正在测试的内部功能,它仍然可以工作。停止在您的包裹中使用 source
。
我刚刚开始使用 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
附相关文件样本如下:
math.R
source('add.R')
source('subtract.R')
doubleAdd <- function(x){
return(add(x,x) + add(x,x))
}
add.R
add <- function(a,b){
return(a + b)
}
testthat.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()
工作正常。
我应该如何设置这些文件以对我的所有 R 文件进行 test()
运行 测试?
如果您正在构建一个包,则不应使用 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
注意 - 实际上你甚至不需要导出 add
。如果它是您正在测试的内部功能,它仍然可以工作。停止在您的包裹中使用 source
。