46

我正在使用Hadley 的基于 testthat 的方法对我的包进行自动化测试。

使用这种方法,最适合放置测试数据文件的位置是什么,这些文件仅由测试/testthat 中的测试脚本使用,而不是 R/ 中的任何其他函数?

我目前的方法是将它们放入tests/testdata,然后read.table从那里使用相对路径而不是 system.file (以避免需要安装包来运行测试)。

有没有标准的方法来做到这一点?

4

4 回答 4

40

摘自 Ben Bolker 的评论:

我使用 inst/testdata 然后 system.file("testdata",...,package="my_package")

这种方法的优点:

  • 您可以保持文件结构整洁,尤其是当您有许多数据文件和/或测试时。
  • 安装文件的事实inst是长期的规范 R 实践;似乎system.file("testdata", "some_file")总是比那样更安全../testdata/some_file。在执行R CMD check.
  • 与 Sathish 的回答不同,它不依赖于您的数据被“存储”为 R 代码。
于 2017-03-28T23:06:20.223 回答
16
  • 测试保存在以“test_”为前缀的文件中
  • 数据保存在前缀为“helper_”的文件中

包目录和文件结构:

└──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 ================================================================
于 2016-10-02T23:57:54.277 回答
10

同一本 R-Pkgs 书的数据章节说“可以将小文件直接放在测试目录中”。这就是我过去所做的。听起来这就是你已经在做的事情,加上testdata目录。

于 2016-10-24T23:11:07.330 回答
0

我有同样的问题。我在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")
      ),
    ...
  )
})
于 2022-03-03T09:25:53.440 回答