2015-12-04 2 views
6

Я работаю над пакетом PKNCA для R. При разработке кода тестирования некоторые из тестов также были бы хорошими примерами. Я хочу сохранить их как (тест, так и пример). Есть ли способ, который я могу встроить в документацию roxygen2, которая также будет скопирована в тестирование?Могу ли я автоматически генерировать модульные тесты для testthat из примеров roxygen2?

Что я думаю о том, как документация:

#' @exampleTest 
#' set.seed(5) 
#' rnorm(1) ## -0.8409 

И что бы произвести испытание, как:

expect_equal({set.seed(5) 
       rnorm(1)}, -0.8409, tol=1e-4) 

(Тол ​​исходил из того, что это число и количество цифр, показанных в примере.)

ответ

2

Использовать devtools::run_examples(), как описано в the check chapter of Hadley Wickham's book on packages. Примеры функций проверяются при запуске R CMD CHECK. Это не часть теста, а скорее стандартная система проверки пакетов R.

+0

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

+0

Более конкретно, 'testthat :: test_examples' будет запускать примеры в пакете во время тестирования. Тест проходит, когда ошибок при запуске примеров нет. –

1

Существует способ, но это не так гладко, как хотелось бы. Вам нужно будет позвонить testthat функции внутри вашего блока @examples. Вот пример функции:

#' @examples 
#' testStrings <- c("1234567890", 
#'     "123 456 7890") 
#' 
#' testthat::expect_equal(extractPhoneNumbers(testStrings), "0123") 
extractPhoneNumbers <- function(inputStr) { 
    # check input: 
    if (!is.character(inputStr)) { 
     stop("'inputStr' must be a (vector of) string(s)!") 
    } 

    # imports 
    `%>%` <- stringr::`%>%` 
    replace_all <- stringr::str_replace_all 
    extract_all <- stringr::str_extract_all 

    # intermediary regex's 
    visualDelimitersRegex <- "[()+\\-_. ]" 
    phoneNumberRegex <- "[:digit:]{10}" 

    inputStr %>% 
    replace_all(pattern = visualDelimitersRegex, replacement = "") %>% 
    extract_all(pattern = phoneNumberRegex) 
} 

При запуске devtools::run_examples() или devtools::check, как будет бросать ошибки, так как вызов testthat::expect_equal() выдает ошибку.

Пример вывода из devtools::check выглядит

*** SNIP *** 
* checking for unstated dependencies in examples ... OK 
* checking examples ... ERROR 
Running examples in ‘demoPkg-Ex.R’ failed 
The error most likely occurred in: 

> base::assign(".ptime", proc.time(), pos = "CheckExEnv") 
> ### Name: extractPhoneNumbers 
> ### Title: Extract Phone Numbers 
> ### Aliases: extractPhoneNumbers 
> 
> ### ** Examples 
> 
> testStrings <- c("1234567890", 
+     "123 456 7890") 
> 
> testthat::expect_equal(extractPhoneNumbers(testStrings), "0123") 
Error: extractPhoneNumbers(testStrings) not equal to "0123" 
Modes: list, character 
Length mismatch: comparison on first 1 components 
Component 1: 1 string mismatch 
Execution halted 
* checking for unstated dependencies in ‘tests’ ... OK 
* checking tests ... 
    Running ‘testthat.R’ 
OK 
* checking PDF version of manual ... OK 
* DONE 

Status: 1 ERROR 
+0

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

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