标签: testthat

如何在R中进行数据库连接/查询以进行单元测试

我正在使用该testthat库在R项目中进行单元测试.我想测试依赖于数据库查询的代码,但不测试实际的查询本身.换句话说,我想模拟数据库连接和查询(让它们返回预定的数据集或命中测试数据库).

我知道Ruby中有很多宝石,以及其他语言中的其他宝石,它们提供了这种功能.R有什么类似的吗?或者我该如何完成它?

some_file.R:

sqlQuery <- function(some_query) {
        chnl <- odbcConnect(get.db.name())
        data <- sqlQuery(chnl, query)
}
Run Code Online (Sandbox Code Playgroud)

从测试文件:

test_that("test query", {
    dataset <- sqlQuery("SELECT * FROM some_database_table")
    #How to make this not actually hit the production database?
    expect_equal(nrow(dataset), 2)
} )
Run Code Online (Sandbox Code Playgroud)

如果没有方便的包,testthat::with_mock()我最好的选择?

r testthat

9
推荐指数
1
解决办法
598
查看次数

对R包的/ src文件夹中的代码进行单元测试?

我正在贡献一个R包,它广泛使用C代码进行计算.

我们已经开始使用testthat包编写R函数的测试,将测试放在inst/tests以下说明中.

testthat包是否适合直接测试C函数(例如没有R接口的那些)?或者我们找到一个单独的C测试包?如果是这样,1)这些测试应该去哪里,2)我如何让它们在运行期间运行R CMD check,3)是否在这种情况下特别适合的任何C测试包?

c unit-testing r testthat

8
推荐指数
1
解决办法
473
查看次数

testthat:处理警告和值

处理生成警告然后还返回值的调用的最佳方法是什么?

例如

> require(testthat)
> expect_warning(log(-1))
> expect_equal(log(-1), NaN)
Warning message:
In log(-1) : NaNs produced
Run Code Online (Sandbox Code Playgroud)

我想编写测试,以便对log(-1)的调用应该(a)生成警告和(b)返回值NaN.上面的方法有效,但在底部看到"警告信息:"可能会让人感到困惑.我应该暂时禁止警告吗?

r testthat

8
推荐指数
1
解决办法
782
查看次数

r - data.table和testthat包

我正在构建一个使用data.table的包,应该使用package testthat进行测试.虽然代码在从命令行调用时工作正常,但在从测试用例调用时会遇到问题.似乎在运行测试时使用了基本包中的[]函数,即data.frames的函数.

我创建了一个最小的例子,可以在这里找到:https://github.com/utalo/test_datatable_testthat

该软件包包含一个函数:

test <- function() {
   dt <- data.table(MESSAGE="Test 1234567890",TYPE="ERROR")
   dt[,.(MESSAGE=strwrap(MESSAGE,width = 10)),by=.(TYPE)]
}
Run Code Online (Sandbox Code Playgroud)

test.datatable.testthat:::test()从命令行调用时,我得到了预期的结果:

    TYPE    MESSAGE
 1: ERROR       Test
 2: ERROR 1234567890
Run Code Online (Sandbox Code Playgroud)

但是,在执行以下单元测试时:

test_that("Test package",{
  dt <- test()

  expected_res <- structure(list(TYPE = c("ERROR", "ERROR"),
                             MESSAGE = c("Test","1234567890")),
                        row.names = c(NA, -2L), class = c("data.table","data.frame"),
                        .Names = c("TYPE", "MESSAGE"))

  expect_equal(dt,expected_res)
})
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

1
1. Error: Test package -------------------------------------------------------------------------------------------------------
could not find function "."
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage"))
2: …
Run Code Online (Sandbox Code Playgroud)

r testthat data.table r-package

8
推荐指数
1
解决办法
821
查看次数

比较data_frames时如何在testthat中设置expect_equal的容差?

当我检查两个 data_frames 是否相等时,我在使用 testthat 的公差参数时遇到问题。这是一个包含两个数据框的简单示例:

library(dplyr)
library(testthat)
d1 = data_frame(a = c(1, 1),
                b = c(2, 2))
d2 = data_frame(a = c(1, 1.00001),
                b = c(2, 2))
Run Code Online (Sandbox Code Playgroud)

当我检查相等性时,即使容差值足够高,testthat 也会抛出错误:

expect_equal(d1, d2,
             tolerance = 0.01)

# Error: d1 not equal to d2
# Rows in y but not x: 2. Rows with difference occurences in x and y: 1
Run Code Online (Sandbox Code Playgroud)

当我比较单个向量时不会抛出错误:

expect_equal(d1$a, d2$a,
             tolerance = 0.01)
expect_equal(d1$b, d2$b,
             tolerance = 0.01)
Run Code Online (Sandbox Code Playgroud)

有什么建议?我假设我滥用了 expect_equal 函数,但除了在数据框的各个列上运行 expect_equal 之外,我不确定如何解决。

这是我正在使用的软件包版本:

packageVersion("dplyr")
# [1] ‘0.4.3’
packageVersion("testthat") …
Run Code Online (Sandbox Code Playgroud)

r testthat dplyr

8
推荐指数
1
解决办法
882
查看次数

我可以从roxygen2示例中自动生成测试单元测试吗?

我正在研究R的PKNCA包.在开发测试代码时,一些测试也是很好的例子.我想把它们作为两者(测试和示例).有没有办法可以在roxygen2文档中嵌入一些内容,这些内容也会被复制到测试中?

我在想的是文档,如:

#' @exampleTest
#' set.seed(5)
#' rnorm(1) ## -0.8409
Run Code Online (Sandbox Code Playgroud)

这会产生如下测试:

expect_equal({set.seed(5)
              rnorm(1)}, -0.8409, tol=1e-4)
Run Code Online (Sandbox Code Playgroud)

(tol来自这个事实,它是一个数字和示例中显示的位数.)

r roxygen2 testthat

7
推荐指数
1
解决办法
315
查看次数

测试包写入磁盘的功能

我正在尝试为 R 中的包函数编写测试。

\n\n

假设我们有一个函数,只需x使用以下命令将字符串写入磁盘writeLines()

\n\n
exporting_function <- function(x, file) {\n\n writeLines(x, con = file)\n\n invisible(NULL)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试它的一种方法是检查文件是否存在。通常,它一开始不应该存在,但在运行导出函数之后它应该存在。另外,您可能想测试文件大小是否大于 0:

\n\n
library(testthat)\n\ntest_that("file is written to disk", {\n file = \'output.txt\'\n expect_false(file.exists(file))\n\n exporting_function("This is a test",\n                    file = file)\n\n\n expect_true(file.exists(file))\n\n expect_gt(file.info(\'output.txt\')$size, 0)\n})\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个很好的测试方法吗?在CRAN 存储库政策中,它指出Packages should not write in the user\xe2\x80\x99s home filespace (including clipboards), nor anywhere else on the file system apart from the R session\xe2\x80\x99s temporary directory. 这个测试会违反这个限制吗?

\n\n

有一个expect_output_file函数。从文档和示例中,我不确定这是否是测试该功能的更合适的期望。它需要一个object参数,该参数应该是 …

r cran testthat

7
推荐指数
1
解决办法
624
查看次数

R testthat GitHub Actions 快照

我正在使用 GitHub Actions 进行 R CMD 检查(请参阅https://github.com/r-lib/actions)。

我想snapshot_filetestthat这种脚本中使用:

save_png <- function(code, width = 1000, height = 600) {
  path <- tempfile(fileext = ".png")
  grDevices::png(path, width = width, height = height)
  on.exit(dev.off())
  code
  
  path
}

set.seed(123)
df <- data.frame(y=rnorm(20),x=rnorm(20))

test_that("graphs are correct", {
  expect_snapshot_file(path = save_png(plot(df$y,df$x)), name = "plot1.png")
}
Run Code Online (Sandbox Code Playgroud)

目前,错误将始终是: Adding new file snapshot "_snaps/gets-test1-example/plot1.png"。或者,如果我上传在我的笔记本电脑上生成的绘图,我会收到一个错误,它们是不同的(非常轻微)......

因为我知道快照测试很脆弱,所以我想到了两个选择:

  • 删除在我的笔记本电脑上生成的 _snaps 文件夹中的所有快照文件,然后使用某种形式的 upload-artefact ( https://github.com/actions/upload-artifact ) 第一次上传快照 - 然后GitHub actions 有由同一台机器生成的东西来测试它(我在想类似每个操作系统的专用存储位置,其中现有文件首先加载到工作流机器然后检查)
  • 跳过 GitHub Actions 上的所有 snapshot_files(使用 …

r testthat github-actions

7
推荐指数
1
解决办法
594
查看次数

安装具有特定版本和测试的 R 包

我想运行包内部测试testthat::test_package('httr')在包的特定版本上运行包内部测试。有没有办法安装具有特定版本的 R 包(例如来自 CRAN)及其测试?

我知道有 install.packages("httr", INSTALL_opts = "--install-tests") 安装给定软件包的测试(没有任何选项来指定特定的软件包版本)。

并且有 devtools::install_version("httr", version = "1.4.1")renv::install("httr@1.4.1") 要安装软件包的特定版本(无法指定例如 INSTALL_opts)。

我没有看到任何方法可以将软件包版本的规范与--install-tests选项结合起来。任何帮助,将不胜感激!

注意:包“httr”在这里仅用作占位符。

installation r devtools testthat r-package

7
推荐指数
1
解决办法
3129
查看次数

在 R 的 testthat 中运行单个测试函数

R 的testthat包有许多用于运行测试的函数:https://testthat.r-lib.org/reference/index.html#run-tests。但是,您可以过滤测试的最粗略级别似乎是在文件级别,因为有一个test_file()函数没有任何过滤参数,并且test_dir()有一个过滤参数,但它仅用于按文件名过滤。

然而,我经常只想运行一个测试,因为它是新的,或者因为我知道它与我刚刚所做的更改相关。

有没有办法在 R 控制台或 RStudio 中运行单个testthat测试?如果没有,是否有其他推荐的解决方案来解决这个问题,例如将每个测试放在它自己的文件中(尽管这看起来很痛苦)?

testing r testthat

7
推荐指数
0
解决办法
568
查看次数