Подтвердить что ты не робот

Как проверить, что ошибка не возникает?

Я начинаю внедрять тестирование для R-пакета и использовал пакет testthat. Обратите внимание, что я новичок в тестировании, поэтому, возможно, мой подход отключен.

У меня есть функция, которая в настоящее время терпит неудачу в 16-й раз, когда она выполняется, и, прежде чем исправлять это, я хочу написать регрессионный тест, который поймает его, если он снова появится.

например, следующее всегда выдает одно и то же сообщение об ошибке:

 for i in (1:17) myfun()

myfun ничего не возвращает, он имеет только побочный эффект открытия соединения с базой данных. Мне ясно, что я могу написать тест, который ожидает ошибку и передает, если он возвращается:

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

Но я не совсем понимаю, как написать тест, чтобы ошибка не возникала. Поскольку это не очевидно, возможно, мой подход ошибочен. Я могу понять, как писать более конкретные тесты, но я хотел бы начать с этого.

Какой тип теста я бы написал, чтобы убедиться, что такая ошибка не появляется?

4b9b3361

Ответ 1

Основное изменение из-за изменений в testthat

Начиная с версии 0.11 (через Блог RStudio) существует прямая поддержка тестирования недостатка ошибок:

expect_error(myfun(), NA)

То же самое для ловли warning и message:

expect_warning(myfun(), NA)
expect_message(myfun(), NA)

Примечание: если вы проверяете цикл, в expect_xxx функции передаются дополнительные параметры info parametr. Итак, вы можете сделать:

for (i in 1:17) expect_error(myfun(), NA, info = paste("i =", i))

Ответ 2

Может быть, обернуть его другим expect_error.

Пример:

expect_error(1)
expect_error(expect_error(1))

Ответ 3

Например:

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)

это означает, что первая часть прошла тест, пока вторая часть не удалась.

Ответ 4

Вот одно решение, использующее ожидание того, что tryCatch возвращает 0, когда ошибка не возникает:

expect_equal(tryCatch(for(i in 1:17) myfun()), 0)