kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
David LeBauer
David LeBauer
Вопрос

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

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

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

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

 for i in (1:17) myfun()

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

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

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

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

36 2012-05-31T01:26:51+00:00 4
David LeBauer
David LeBauer
Редактировал вопрос 31-го мая 2012 в 1:54
Программирование
r
testing
Решение / Ответ
 Marek
Marek
6-го мая 2015 в 5:28
2015-05-06T05:28:03+00:00
Дополнительно
Источник
Редактировать
#16319213

Основные изменения в связи с изменениями в testthat

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

expect_error(myfun(), NA)

Же для ловли "предупреждение" и "сообщение":

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

Примечание: Если вы испытываете цикл есть "инфо" параметр в функции expect_xxx передавать дополнительную информацию. Так что вы можете сделать:

for (i in 1:17) expect_error(myfun(), NA, info = paste("i =", i))
Hong Ooi
Hong Ooi
Редактировал ответ 26-го июля 2017 в 10:17
testthat 0.11.0 · RStudio
blog.rstudio.org
35
0
 zhangns07
zhangns07
26-го марта 2015 в 11:11
2015-03-26T23:11:57+00:00
Дополнительно
Источник
Редактировать
#16319212

Возможно, оберните его еще одним expect_error.

Пример:

expect_error(1)
expect_error(expect_error(1))
10
0
 kohske
kohske
31-го мая 2012 в 2:16
2012-05-31T02:16:31+00:00
Дополнительно
Источник
Редактировать
#16319210

Например:

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)

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

7
0
David LeBauer
David LeBauer
31-го мая 2012 в 2:48
2012-05-31T02:48:34+00:00
Дополнительно
Источник
Редактировать
#16319211

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

expect_equal(tryCatch(for(i in 1:17) myfun()), 0)
3
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией