如何测试不会发生错误?

Dav*_*uer 36 testing r

我开始实现R包的测试,并且一直在使用该testthat包.请注意,我是测试的新手,所以也许我的方法是关闭的.

我有一个功能,当前它第16次执行失败,在修复之前,我想写一个回归测试,如果它重新出现将捕获它.

例如,以下内容始终抛出相同的错误消息:

 for i in (1:17) myfun()
Run Code Online (Sandbox Code Playgroud)

myfun不会返回任何内容,它只会产生打开数据库连接的副作用.我很清楚,我可以编写一个期望错误的测试,并在返回时传递:

 expect_error(for (i in 1:17) myfun()) 
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*rek 35

主要编辑由于testthat的变化

自版本0.11(通过RStudio博客)以来,直接支持测试缺少错误:

expect_error(myfun(), NA)
Run Code Online (Sandbox Code Playgroud)

同样适合捕捉warningmessage:

expect_warning(myfun(), NA)
expect_message(myfun(), NA)
Run Code Online (Sandbox Code Playgroud)

旁注:如果您测试循环,则函数中有info参数expect_xxx来传递其他信息.所以你可以这样做:

for (i in 1:17) expect_error(myfun(), NA, info = paste("i =", i))
Run Code Online (Sandbox Code Playgroud)


小智 10

也许用另一个expect_error包装它.

例:

expect_error(1)
expect_error(expect_error(1))
Run Code Online (Sandbox Code Playgroud)


koh*_*ske 7

例如:

context("test error")
test_that("test error 1", {
  expect_true({log(10); TRUE})
})

test_that("test error 2", {
  expect_true({log("a"); TRUE})
})
Run Code Online (Sandbox Code Playgroud)

将测试是否有错误.

> 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)
Run Code Online (Sandbox Code Playgroud)

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