我开始实施R包的测试,并且一直在使用testthat
包。请注意,我是测试的新手,所以也许我的方法已经关闭。
我有一个功能,目前第16次执行失败,在修复之前,我想写一个回归测试,如果它重新出现就会捕获它。
例如,以下内容始终抛出相同的错误消息: for i in (1:17) myfun()
myfun
不会返回任何内容,只会产生打开数据库连接的副作用。我很清楚,我可以编写一个期望错误的测试,并在返回时传递:
expect_error(for (i in 1:17) myfun())
但我不太清楚如何编写测试以确保不会发生错误。由于不明显,也许我的做法是错误的。我可以弄清楚如何编写更具体的测试,但我想从这个开始。
我会写什么类型的测试以确保不会出现这样的错误?
答案 0 :(得分:31)
由于测试更改而导致的重大编辑
从版本0.11开始(通过RStudio blog),可以直接支持测试缺少错误:
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))
答案 1 :(得分:9)
也许用另一个expect_error包装它。
示例:
expect_error(1)
expect_error(expect_error(1))
答案 2 :(得分:6)
例如:
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)
这意味着第一部分通过测试而第二部分失败。
答案 3 :(得分:3)
以下是使用期望tryCatch
在未发生错误时返回0
的解决方案:
expect_equal(tryCatch(for(i in 1:17) myfun()), 0)