44

我开始对 R 包进行测试,并且一直在使用该testthat包。请注意,我是新来的测试,所以也许我的方法是关闭的。

我有一个函数在第 16 次执行时失败,在修复这个问题之前,我想编写一个回归测试,如果它再次出现,它将捕获它。

例如,以下总是抛出相同的错误消息:

 for i in (1:17) myfun()

myfun不返回任何东西,它只有打开数据库连接的副作用。我很清楚,我可以编写一个预期错误并在返回时通过的测试:

 expect_error(for (i in 1:17) myfun()) 

但我不太明白如何编写测试以确保不会发生错误。由于它并不明显,也许我的方法是错误的。我可以弄清楚如何编写更具体的测试,但我想从这个开始。

我会写什么类型的测试来确保不会出现这样的错误?

4

4 回答 4

45

由于 testthat 的变化而进行了重大编辑

自 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))
于 2015-05-06T05:28:03.937 回答
10

也许用另一个 expect_error 包装它。

例子:

expect_error(1)
expect_error(expect_error(1))
于 2015-03-26T23:11:57.513 回答
8

例如:

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)

这意味着第一部分通过了测试,而第二部分失败了。

于 2012-05-31T02:16:31.533 回答
4

这是一种使用不发生错误时tryCatch返回的期望的解决方案:0

expect_equal(tryCatch(for(i in 1:17) myfun()), 0)
于 2012-05-31T02:48:34.563 回答