簡體   English   中英

使用 testthat 測試函數參數的條件

[英]Testing conditions on a function's parameter using testthat

我有一個func(expr, data.sizes)形式的 function ,其中參數expr是一個表達式,而名為data.sizes的參數通常顧名思義是一個向量或數據大小序列。 (例如: c(10, 100, 1000)10^seq(1, 3)

我想使用testthat為我的函數參數編寫一些測試用例,但是對於 R 中的單元測試是新手,所以我想知道如何使用testthat來測試函數參數的條件?

例如,我想在我的 function 中檢查參數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 檢查 function 的結果是否符合您的預期。

如果要測試 function 到 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)
})

要測試 function 內部參數的有效性,您可以使用 assertthat 等斷言編程包。

您的單元測試可以使用給定的輸入測試 function 的 output。 不是讓您的 function 篩選給定變量以查找不適當輸入的方法。 這必須在您的 function 內部完成。

單元測試必須簡單地使用一些參數調用您的 function 並確保 output 符合預期。

例如,假設您希望func返回一個列表,其中包含根據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)))
})

所以你知道如果這個測試通過了,你的錯誤就會被恰當地發現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM