使用 testthat 测试函数参数的条件

Testing conditions on a function's parameter using testthat

我有一个形式为 func(expr, data.sizes) 的函数,其中参数 expr 是一个表达式,而名为 data.sizes 的参数通常顾名思义,是向量或序列数据大小。 (例如:c(10, 100, 1000)10^seq(1, 3)

我想使用 testthat 为我的函数参数编写一些测试用例,但我是 R 中单元测试的新手,所以我想知道一个函数参数的测试条件如何( s) 使用 testthat

例如,我想在我的函数中检查参数 data.size 的可能 NA 值,并且我编写了这个代码片段以在我的控制台中进行测试:(该函数在 Global Env 中可用。)

test_that("NA test for data.sizes", {
  expect_false(is.na(data.sizes %in% func(expression, data.sizes = c(10, 100))))
})

抛出错误:

* object 'data.sizes' not found
1: expect_false(is.na(data.sizes %in% func(expression, data.sizes = c(10, 
       10)))) at :2
2: quasi_label(enquo(object), label, arg = "object")
3: eval_bare(get_expr(quo), get_env(quo))
4: data.sizes %in% func(expression, data.sizes = c(10, 10))

我可能做错了什么?另外,使用 testthat 将测试条件应用于函数参数的一般语法是什么?

testthat 检查函数的结果是否符合您的预期。

如果你想测试函数的结果到NAs,你可以为此做一个具体的测试:

library(testthat)
library(assertthat)

func <- function(expr,data.sizes) {
  assert_that(noNA(data.sizes))
  eval(expr)
}

test_that("data.sizes test for func", {
  # Success
  expect_error(func(expression(data.sizes[1]+data.sizes[2]), data.sizes = c(1,NA)))
  expect_equal(func(expression(data.sizes[1]+data.sizes[2]), data.sizes = c(1,2)),3)
  # Failure
  expect_equal(func(expression(data.sizes[1]+data.sizes[2]), data.sizes = c(1,2)),4)
})

要测试函数内参数的有效性,您可以使用 assertive programming 包,如 assertthat。

您的单元测试可以使用给定的输入测试函数的输出。它 不是 一种允许您的函数筛选给定变量以查找不适当输入的方法。这必须在您的函数内部完成。

单元测试必须简单地使用一些参数调用您的函数并确保输出符合预期。

例如,假设您想要 func 到 return 一个列表,其中包含根据 data.sizes 计算的表达式的重复项,如下所示:

func <- function(expression, data.sizes)
{
  expression <- as.expression(as.list(match.call())$expression)
  if(!all(!is.na(data.sizes))) stop("data.sizes may not contain NAs")
  lapply(data.sizes, function(x) rep(eval(expression), x))
}

所以它会做这样的事情:

y <- 5
func(y^2 + 3, 1:3)
#> [[1]]
#> [1] 28
#> 
#> [[2]]
#> [1] 28 28
#> 
#> [[3]]
#> [1] 28 28 28

但是如果 data.sizes 中有 NA 个值,您希望抛出异常:

func(y^2 + 3, c(1, NA))
#> Error in func(y^2 + 3, c(1, NA)) : data.sizes may not contain NAs

那么您的单元测试将如下所示:

test_that("NA test for data.sizes", {
  expect_list(func(y^2 + 3, 1:3))
  expect_error(func(y^2 + 3, c(1, NA)))
})

所以你知道如果这个测试通过了,你的错误就会被适当地发现