如何测试使用 Sys.time() 的 R 函数?
How to test an R function which uses Sys.time()?
我在一个软件包中有如下的R函数,输出Sys.time()
到output让用户知道算法是如何进行的:
func = function(num1, num2){
result = num1 + num2
return(paste0(' ', as.character(Sys.time()), ': with result: ', result))
}
该函数的使用示例如下:
> func(2, 2)
[1] " 2018-03-11 07:24:05: with result: 4"
>
我需要测试这个功能。通常,我会使用 testthat 包:
https://cran.r-project.org/web/packages/testthat/index.html
问题:set
Sys.time() 如何测试这个函数?还有其他方法可以测试这个吗?
如果没有Sys.time()
,这个过程就简单了:
library(testthat)
expect_equal(func(2, 2), 4)
expect_equal(func(2, -2), 0)
expect_error(func('a', 'b'))
你可以使用类似这样的东西。
func <- function(num1, num2){
result = num1 + num2
return(paste0(' ', as.character(Sys.time()), ': with result: ', result))
}
library(testthat)
使用 stringr
expect_equal(as.numeric(stringr::str_extract(func(2, 2), "[0-9]*\.*[0-9]*$")), 4)
expect_equal(as.numeric(stringr::str_extract(func(2, -2), "[0-9]*\.*[0-9]+$")), 0)
expect_equal(as.numeric(stringr::str_extract(func(15, 21.3), "[0-9]*\.*[0-9]+$")), 36.3)
使用基数 r
expect_equal(as.numeric(regmatches(func(2, 2), regexpr("[0-9]*\.*[0-9]*$", func(2, 2)))), 4)
expect_equal(as.numeric(regmatches(func(2, -2), regexpr("[0-9]*\.*[0-9]*$", func(2, -2)))), 0)
expect_equal(as.numeric(regmatches(func(15, 21.3), regexpr("[0-9]*\.*[0-9]*$",func(15, 21.3)))), 36.3)
或准确测试函数的内部结构,但这取决于您的函数内部结构到底是什么。
expect_equal(func(2, 2), paste0(' ', as.character(Sys.time()), ': with result: ', 4))
expect_equal(func(2, -2), paste0(' ', as.character(Sys.time()), ': with result: ', 0))
expect_equal(func(15, 21.3), paste0(' ', as.character(Sys.time()), ': with result: ', 36.3))
我认为您应该重写您的函数,以便 returns 列表中的结果和时间。然后创建一个执行格式化的自定义打印函数。这样,您仍然可以直接以编程方式处理结果,而无需使用正则表达式来提取结果。这是一个例子。
func <- function(num1, num2){
result <- num1 + num2
time <- Sys.time()
output <- list(result = result, time = time)
class(output) <- "MyClass"
return(output)
}
print.MyClass <- function(obj, ...){
text <- paste0(' ', as.character(obj$time), ': with result: ', obj$result)
print.default(text)
}
并使用这个...
> func(2, 2)
[1] " 2018-03-13 13:26:22: with result: 4"
> o <- func(2,2)
> o$result
[1] 4
> o$time
[1] "2018-03-13 13:26:27 CDT"
>
> expect_equal(func(2, 2)$result, 4)
> expect_equal(func(2, 2)$result, 5) # should give the required error...
Error: func(2, 2)$result not equal to 5.
1/1 mismatches
[1] 4 - 5 == -1
请注意此处更容易测试的优点。您也不必更改结果计算正确的测试 if/when 您决定更改打印函数内的格式。
我在一个软件包中有如下的R函数,输出Sys.time()
到output让用户知道算法是如何进行的:
func = function(num1, num2){
result = num1 + num2
return(paste0(' ', as.character(Sys.time()), ': with result: ', result))
}
该函数的使用示例如下:
> func(2, 2)
[1] " 2018-03-11 07:24:05: with result: 4"
>
我需要测试这个功能。通常,我会使用 testthat 包:
https://cran.r-project.org/web/packages/testthat/index.html
问题:set
Sys.time() 如何测试这个函数?还有其他方法可以测试这个吗?
如果没有Sys.time()
,这个过程就简单了:
library(testthat)
expect_equal(func(2, 2), 4)
expect_equal(func(2, -2), 0)
expect_error(func('a', 'b'))
你可以使用类似这样的东西。
func <- function(num1, num2){
result = num1 + num2
return(paste0(' ', as.character(Sys.time()), ': with result: ', result))
}
library(testthat)
使用 stringr
expect_equal(as.numeric(stringr::str_extract(func(2, 2), "[0-9]*\.*[0-9]*$")), 4)
expect_equal(as.numeric(stringr::str_extract(func(2, -2), "[0-9]*\.*[0-9]+$")), 0)
expect_equal(as.numeric(stringr::str_extract(func(15, 21.3), "[0-9]*\.*[0-9]+$")), 36.3)
使用基数 r
expect_equal(as.numeric(regmatches(func(2, 2), regexpr("[0-9]*\.*[0-9]*$", func(2, 2)))), 4)
expect_equal(as.numeric(regmatches(func(2, -2), regexpr("[0-9]*\.*[0-9]*$", func(2, -2)))), 0)
expect_equal(as.numeric(regmatches(func(15, 21.3), regexpr("[0-9]*\.*[0-9]*$",func(15, 21.3)))), 36.3)
或准确测试函数的内部结构,但这取决于您的函数内部结构到底是什么。
expect_equal(func(2, 2), paste0(' ', as.character(Sys.time()), ': with result: ', 4))
expect_equal(func(2, -2), paste0(' ', as.character(Sys.time()), ': with result: ', 0))
expect_equal(func(15, 21.3), paste0(' ', as.character(Sys.time()), ': with result: ', 36.3))
我认为您应该重写您的函数,以便 returns 列表中的结果和时间。然后创建一个执行格式化的自定义打印函数。这样,您仍然可以直接以编程方式处理结果,而无需使用正则表达式来提取结果。这是一个例子。
func <- function(num1, num2){
result <- num1 + num2
time <- Sys.time()
output <- list(result = result, time = time)
class(output) <- "MyClass"
return(output)
}
print.MyClass <- function(obj, ...){
text <- paste0(' ', as.character(obj$time), ': with result: ', obj$result)
print.default(text)
}
并使用这个...
> func(2, 2)
[1] " 2018-03-13 13:26:22: with result: 4"
> o <- func(2,2)
> o$result
[1] 4
> o$time
[1] "2018-03-13 13:26:27 CDT"
>
> expect_equal(func(2, 2)$result, 4)
> expect_equal(func(2, 2)$result, 5) # should give the required error...
Error: func(2, 2)$result not equal to 5.
1/1 mismatches
[1] 4 - 5 == -1
请注意此处更容易测试的优点。您也不必更改结果计算正确的测试 if/when 您决定更改打印函数内的格式。