我们可以使用 testthat 包中的函数来测试向量的元素吗?

Posted

技术标签:

【中文标题】我们可以使用 testthat 包中的函数来测试向量的元素吗?【英文标题】:Can we use funtions from testthat package to test elements of a vector? 【发布时间】:2021-11-16 17:32:18 【问题描述】:

我创建了一个包含函数的包,在本例中是 myfunction(argument1, argument2),它只需要与参数长度相同的正输入。我想使用 testthat 包中的函数来测试输入的格式是否正确。 这里的重点是我想测试输入是否有资格成为函数的参数?

我有类似的东西:

test_that("myfunction works", 
 input1 <- c(200, -220, 250)
 input2 <- c(30, 40, 50)
 myfunction(input1, input2)
 
 expect_equal(length(input1), length(input2))
)

现在我想测试我的所有参数 (input1, input2) 是否只包含正数。我怎么能那样做? 我实际上试过这个:

expect_true(input1[] > 0)
expect_true(input2[] >0)

expect_gt(input1[], 0)
expect_gt(input2[], 0)

但随后收到错误消息:

Error: Result of comparison must be a single logical value

似乎 expect_...() 系列函数仅适用于单个值而不是向量或数据框?关于我应该尝试什么的任何建议?

【问题讨论】:

测试输入毫无意义,因为您无法控制用户将要做什么 【参考方案1】:

您的示例有点不寻常,因为通常您会使用测试来检查函数的返回值是否满足某些假设,而不是您刚刚指定的输入值。正如它所写的那样,您并没有检查该功能是否真的有效。

话虽如此,您可以使用:

myfunction <- sum

test_that("myfunction works", 
   input1 <- c(200, -220, 250)
   input2 <- c(30, 40, 50)
   myfunction(input1, input2)
   
   expect_true(all(input1>0))
 )
#-- Failure (Line 6): myfunction works ------------------------------------------
#all(input1 > 0) is not TRUE
#
#`actual`:   FALSE
#`expected`: TRUE 

正确失败是因为并非所有input1 都大于零。

作为您通常如何使用期望值的更具体示例,如果您希望对于这些输入,您的函数应返回单个数字,并且该值应为 350,您可以编写如下测试:

myfunction <- sum #The function you're writing

test_that("myfunction works", 
  input1 <- c(200, -220, 250)
  input2 <- c(30, 40, 50)
  
  expect_true(length(myfunction(input1, input2)) == 1) 
  expect_equal(myfunction(input1, input2), 350)
)

This link on testing 可能是有用的背景(虽然它是从包开发的角度编写的,但其中大部分内容对任何编写代码的人都很有用)。特别是12.2给出了一些例子

【讨论】:

感谢您指出这一点!我实际上对如何实际使用测试感到非常困惑,因为这对我来说是新的。我假设我们为测试提供了一些示例?或者有什么方法可以让测试变得更通用? @ThuyNguyen 我建议this link 测试可能是有用的背景(虽然它是从包开发的角度编写的,但其中大部分对任何编写代码的人都很有用)。特别是 12.2 给出了一些例子。 非常感谢!我刚刚看了看,非常有用的材料。【参考方案2】:

CRAN 上沼气包中的checkArgClassValue() 函数(未导出)用于此类检查。你可以从这里复制它:https://github.com/sashahafner/biogas/blob/master/R/checkArgClassValue.R。为了让你的函数在实际参数不是正数时返回错误,你可以添加这个:

checkArgClassValue(input1, expected.class = c('integer', 'numeric'), expected.range = c(0, Inf))

如果你想要一个警告只添加warn.only = TRUE

有关如何使用它的其他示例,请参阅同一 repo 的 R 目录中定义的函数。

【讨论】:

以上是关于我们可以使用 testthat 包中的函数来测试向量的元素吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写测试用例以使用r中的testthat检查函数是否正常工作?

使用 testthat 在单元测试中重用变量。是不是有一种可接受的做法来避免重新创建计算量大的变量

是否有一个 testthat expect_* 函数用于比较两个对象的行为?

R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤条件推理决策树是传统决策树的一个重要变体条件推理树的分裂是基于显著性测试而不是熵/纯度/同质性度量来选择分裂

R语言使用caret包中的createDataPartition函数进行机器学习数据集划分划分训练集和测试集并指定训练测试比例

R语言使用caret包中的createDataPartition函数进行机器学习数据集划分划分训练集和测试集并指定训练测试比例