用testthat将数据放在哪里进行自动化测试?

Adi*_*tya 32 automated-tests unit-testing r testthat

我正在使用Hadley基于测试的方法来自动测试我的包.

在这种方法中,最适合放置测试数据文件的地方是什么?我指的是仅由测试/测试中的测试脚本使用的文件,但不是R /中的任何其他函数.

我当前的方法是将它们放在tests/testdata中,然后使用相对路径而不是system.file从那里读取.(为了避免需要安装包来运行测试).

到目前为止,是否有任何最佳实践?

小智 26

取消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代码.


小智 25

我有同样的问题。我在github.com/r-lib/devtools中提交了一份报告,其中一位开发人员(Jenny Bryan)可以帮助解决这个问题!

\n

解决方案是将所有测试数据放入“tests/testthat”或其某个子目录中。在测试中,您可以使用 testthat::test_path() 提供路径。使用这种方法,测试可以以两种方式进行,即交互式地在 R-CMD-CHECK 或 devtools::check() 中!

\n

例子:

\n

封装结构

\n
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80pkg_name/\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 DESCRIPTION\n    ...\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests/\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 testthat.R\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testthat/\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test-some_function.R\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testdata\n                \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file_1.csv\n                \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file_2.tif\n
Run Code Online (Sandbox Code Playgroud)\n

测试一些_函数.R

\n
test_that("testname", {\n  expect_equal(\n    some_function(\n      test_path("testdata", "file_2.tif")\n      ),\n    ...\n  )\n})\n
Run Code Online (Sandbox Code Playgroud)\n


Sat*_*ish 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
Run Code Online (Sandbox Code Playgroud)

testthat.R

library(testthat)
library(pkg_name)
test_check("pkg_name")
Run Code Online (Sandbox Code Playgroud)

helper_myfunc1.R包含用于测试myfunc1函数的数据

a1 <- 2
a2 <- 2
b1 <- 2*3
b2 <- 6
Run Code Online (Sandbox Code Playgroud)

helper_myfunc2.R包含用于测试myfunc2函数的数据

c1 <- 50/2
c2 <- 25
d1 <- c(2,3)
d2 <- c(2,3)
Run Code Online (Sandbox Code Playgroud)

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)
          })
Run Code Online (Sandbox Code Playgroud)

进行单元测试

library("devtools")

devtools::load_all()
# Loading pkg_name

devtools::test()
# Loading pkg_name
# Testing pkg_name
# pkg_name_functions: ....

# DONE ================================================================
Run Code Online (Sandbox Code Playgroud)


Dyl*_*lan 7

同一本R-Pkgs书中的数据章节说"可以将小文件直接放在测试目录中".这就是我过去所做的.这听起来就像你正在做的那样,加上testdata目录.