我正在使用该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()我最好的选择?
处理生成警告然后还返回值的调用的最佳方法是什么?
例如
> 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.上面的方法有效,但在底部看到"警告信息:"可能会让人感到困惑.我应该暂时禁止警告吗?
我正在构建一个使用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) 当我检查两个 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的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 中的包函数编写测试。
\n\n假设我们有一个函数,只需x使用以下命令将字符串写入磁盘writeLines():
exporting_function <- function(x, file) {\n\n writeLines(x, con = file)\n\n invisible(NULL)\n}\nRun Code Online (Sandbox Code Playgroud)\n\n测试它的一种方法是检查文件是否存在。通常,它一开始不应该存在,但在运行导出函数之后它应该存在。另外,您可能想测试文件大小是否大于 0:
\n\nlibrary(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})\nRun 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. 这个测试会违反这个限制吗?
有一个expect_output_file函数。从文档和示例中,我不确定这是否是测试该功能的更合适的期望。它需要一个object参数,该参数应该是 …
我正在使用 GitHub Actions 进行 R CMD 检查(请参阅https://github.com/r-lib/actions)。
我想snapshot_file在testthat这种脚本中使用:
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"。或者,如果我上传在我的笔记本电脑上生成的绘图,我会收到一个错误,它们是不同的(非常轻微)......
因为我知道快照测试很脆弱,所以我想到了两个选择:
我想运行包内部测试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”在这里仅用作占位符。
R 的testthat包有许多用于运行测试的函数:https://testthat.r-lib.org/reference/index.html#run-tests。但是,您可以过滤测试的最粗略级别似乎是在文件级别,因为有一个test_file()函数没有任何过滤参数,并且test_dir()有一个过滤参数,但它仅用于按文件名过滤。
然而,我经常只想运行一个测试,因为它是新的,或者因为我知道它与我刚刚所做的更改相关。
有没有办法在 R 控制台或 RStudio 中运行单个testthat测试?如果没有,是否有其他推荐的解决方案来解决这个问题,例如将每个测试放在它自己的文件中(尽管这看起来很痛苦)?
r ×10
testthat ×10
r-package ×2
c ×1
cran ×1
data.table ×1
devtools ×1
dplyr ×1
installation ×1
roxygen2 ×1
testing ×1
unit-testing ×1