2016-07-20 7 views
0

Я хотел бы протестировать функцию по новому набору чисел для каждого теста. Идея заключается в том, чтобы добиться неудачи в тех случаях, которые я не ожидал.Испытание «случайной единицы»

library(testthat) 

hypotenuse_length <- function(a, b){ 
    sqrt(a^2 + b^2) 
} 

bad_hypotenuse_length <- function(a, b){ 
    sqrt(a^2 + b^2) + 1 
} 

test_that("Hypotenuse is always less than sum of other two sides", { 
    a <- abs(rcauchy(1)) 
    b <- abs(rcauchy(1)) 
    expect_lte(bad_hypotenuse_length(a, b), a + b) 
}) 

Вопрос заключается в том, что, когда я получаю отказ, я не знаю, какие значения a и b вызвало сбой.

я могу добиться этого для конкретной операции, с помощью обратной инженерии expect_lte:

my_expect_lte <- function(a, b, actual, expected, label = NULL, expected.label = NULL){ 
    op <- match.fun("<=") 
    lab_act <- testthat:::make_label(actual, label) 
    lab_exp <- testthat:::make_label(expected, expected.label) 
    stopifnot(is.numeric(actual), length(actual) == 1) 
    stopifnot(is.numeric(expected), length(expected) == 1) 
    msg <- "not less than" 
    diff <- actual - expected 
    testthat::expect(op(diff, 0), 
        sprintf("%s is %s %s. Difference: %.3g. a = %.3g b = %.3g", 
          lab_act, msg, lab_exp, diff, a, b)) 
} 

set.seed(1) # not ordinarily present 
a <- abs(rcauchy(1)) 
b <- abs(rcauchy(1)) 
my_expect_lte(a, b, bad_hypotenuse_length(a, b), a + b) 

Error: bad_hypotenuse_length(a, b) is not less than a + b. Difference: 0.143. a = 1.1 b = 2.35

Есть ли способ использовать существующие функции для возвращения подобной информации? То есть, возвращает то же, что и expect_..., но также включает значение переданных аргументов. (Решение Printing custom diagnostic information if `testthat` test fails in `R` либо распечатывает информацию независимо от результата теста, либо не соответствует существующим испытаниям.)

ответ

1

Хотя у меня нет прямого ответа на ваш вопрос, я бы предложил использовать пакет quickcheck, поскольку он обеспечивает рамки для рандомизированного тестирования. Он поставляется с хорошими инструментами для проверки случаев сбоя (см. Использование функции repro в tutorial).

 Смежные вопросы

  • Нет связанных вопросов^_^