我正在使用Hadley 的基于 testthat 的方法对我的包进行自动化测试。
使用这种方法,最适合放置测试数据文件的位置是什么,这些文件仅由测试/testthat 中的测试脚本使用,而不是 R/ 中的任何其他函数?
我目前的方法是将它们放入tests/testdata
,然后read.table
从那里使用相对路径而不是 system.file (以避免需要安装包来运行测试)。
有没有标准的方法来做到这一点?
我正在使用Hadley 的基于 testthat 的方法对我的包进行自动化测试。
使用这种方法,最适合放置测试数据文件的位置是什么,这些文件仅由测试/testthat 中的测试脚本使用,而不是 R/ 中的任何其他函数?
我目前的方法是将它们放入tests/testdata
,然后read.table
从那里使用相对路径而不是 system.file (以避免需要安装包来运行测试)。
有没有标准的方法来做到这一点?
摘自 Ben Bolker 的评论:
我使用 inst/testdata 然后
system.file("testdata",...,package="my_package")
这种方法的优点:
inst
是长期的规范 R 实践;似乎system.file("testdata", "some_file")
总是比那样更安全../testdata/some_file
。在执行R CMD check
.包目录和文件结构:
└──pkg_name/
├── DESCRIPTION
├── NAMESPACE
├──.Rbuildignore
├── data/
├── man/
├── R/
├── vignettes/
└── tests/
├── testthat.R
└── testthat/
└── helper_myfunc1.R
└── helper_myfunc2.R
└── test_pkg_name.R
测试那个.R
library(testthat)
library(pkg_name)
test_check("pkg_name")
helper_myfunc1.R包含用于测试 myfunc1 函数的数据
a1 <- 2
a2 <- 2
b1 <- 2*3
b2 <- 6
helper_myfunc2.R包含用于测试 myfunc2 函数的数据
c1 <- 50/2
c2 <- 25
d1 <- c(2,3)
d2 <- c(2,3)
test_pkg_name.R包含对包中函数和其他对象的测试
context('pkg_name_functions')
test_that('myfunc1',
{
expect_identical(a1, a2)
expect_identical(b1, b2)
})
test_that('myfunc2',
{
expect_identical(c1, c2)
expect_identical(d1, d2)
})
进行单元测试
library("devtools")
devtools::load_all()
# Loading pkg_name
devtools::test()
# Loading pkg_name
# Testing pkg_name
# pkg_name_functions: ....
# DONE ================================================================
同一本 R-Pkgs 书的数据章节说“可以将小文件直接放在测试目录中”。这就是我过去所做的。听起来这就是你已经在做的事情,加上testdata
目录。
我有同样的问题。我在github.com/r-lib/devtools中提交了一个文件,其中一位开发人员(Jenny Bryan)可以提供帮助!
解决方案是将所有用于测试的数据放入“tests/testthat”或它的某个子目录中。在您的测试中,您可以使用 testthat::test_path() 提供路径。使用这种方法,测试以两种方式工作,交互方式和在 R-CMD-CHECK 或 devtools::check() 中!
例子:
封装结构
└──pkg_name/
├── DESCRIPTION
...
└── tests/
├── testthat.R
└── testthat/
├── test-some_function.R
└── testdata
├── file_1.csv
└── file_2.tif
测试-some_function.R
test_that("testname", {
expect_equal(
some_function(
test_path("testdata", "file_2.tif")
),
...
)
})