我开始对 R 包进行测试,并且一直在使用
testthat
包。请注意,我是测试新手,所以也许我的方法不对。
我有一个函数当前在第 16 次执行时失败,在修复此问题之前,我想编写一个回归测试,以便在它再次出现时捕获它。
例如,以下内容总是抛出相同的错误消息:
for i in (1:17) myfun()
myfun
不返回任何内容,它只有打开数据库连接的副作用。我很清楚,我可以编写一个预计会出现错误并在返回时通过的测试:
expect_error(for (i in 1:17) myfun())
但我不太明白如何编写测试以确保不会发生错误。由于它不明显,也许我的方法是错误的。我可以弄清楚如何编写更具体的测试,但我想从这个开始。
我会编写什么类型的测试来确保不会出现此类错误?
由于 testthat 的更改而进行编辑
自版本 3.2.0 (2023-10) 起,有测试缺少条件的函数 (https://testthat.r-lib.org/reference/expect_no_error.html):
expect_no_error(my_fun())
expect_no_warning(my_fun())
expect_no_message(my_fun())
expect_no_condition(my_fun())
减号:它不支持
info
参数。
自版本 0.11(通过 RStudio 博客)开始,直接支持测试是否存在错误:
expect_error(myfun(), NA)
与捕捉
warning
和message
相同:
expect_warning(myfun(), NA)
expect_message(myfun(), NA)
旁注:
info
函数中有一个expect_xxx
参数来传递附加信息。所以你可以这样做:
for (i in 1:17) expect_error(myfun(), NA, info = paste("i =", i))
也许用另一个expect_error来包装它。
示例:
expect_error(1)
expect_error(expect_error(1))
例如:
context("test error")
test_that("test error 1", {
expect_true({log(10); TRUE})
})
test_that("test error 2", {
expect_true({log("a"); TRUE})
})
将测试是否有错误。
> test_file("x.r")
test error : .1
1. Error: test error 2 -------------------------
Non-numeric argument to mathematical function
1: expect_true({
log("a")
TRUE
})
2: expect_that(object, is_true(), info, label)
3: condition(object)
4: expectation(identical(x, TRUE), "isn't true")
5: identical(x, TRUE)
这意味着第一部分通过了测试,而第二部分失败了。
这是一种使用预期的解决方案,当错误不发生时,
tryCatch
返回0
:
expect_equal(tryCatch(for(i in 1:17) myfun()), 0)