我可以从 roxygen2 示例自动生成 testthat 的单元测试吗?
Can I automatically generate unit tests for testthat from roxygen2 examples?
我正在为 R 开发 PKNCA 包。在开发测试代码时,一些测试也是很好的例子。我想将它们同时保留(测试和示例)。有没有一种方法可以在 roxygen2 文档中嵌入一些内容,这些内容也将被复制到测试中?
我在想的是这样的文档:
#' @exampleTest
#' set.seed(5)
#' rnorm(1) ## -0.8409
这将生成如下测试:
expect_equal({set.seed(5)
rnorm(1)}, -0.8409, tol=1e-4)
(这个 tol 是因为它是一个数字和示例中显示的位数。)
按照 the check chapter of Hadley Wickham's book on packages 中的说明使用 devtools::run_examples()
。 运行 R CMD CHECK 时会测试功能示例。这不是 testthat 的一部分,而是标准 R 包检查系统的一部分。
方法是有的,只是没有你想的那么顺利。您必须在 @examples
块中调用 testthat
函数。这是一个示例函数:
#' @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
我正在为 R 开发 PKNCA 包。在开发测试代码时,一些测试也是很好的例子。我想将它们同时保留(测试和示例)。有没有一种方法可以在 roxygen2 文档中嵌入一些内容,这些内容也将被复制到测试中?
我在想的是这样的文档:
#' @exampleTest
#' set.seed(5)
#' rnorm(1) ## -0.8409
这将生成如下测试:
expect_equal({set.seed(5)
rnorm(1)}, -0.8409, tol=1e-4)
(这个 tol 是因为它是一个数字和示例中显示的位数。)
按照 the check chapter of Hadley Wickham's book on packages 中的说明使用 devtools::run_examples()
。 运行 R CMD CHECK 时会测试功能示例。这不是 testthat 的一部分,而是标准 R 包检查系统的一部分。
方法是有的,只是没有你想的那么顺利。您必须在 @examples
块中调用 testthat
函数。这是一个示例函数:
#' @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