stopifnot()与assertError()

时间:2016-07-27 07:24:36

标签: r assertions

我想知道stopifnot()assertError()之间的差异是什么:

默认情况下找不到

assertError()(您必须首先加载"工具"包),但stopifnot()是。

更重要的是,即使我传递TRUEFALSE之类的参数,assertError()也会抛出错误消息,而stopifnot()会做出显而易见的事情。

阅读手册页没有帮助。正确使用的是什么,而不是assertError(length(x) != 7)?如果x未定义,则该语句不会产生错误,但一旦定义,它就会产生错误,与x的长度无关(7或不是)。

1 个答案:

答案 0 :(得分:4)

主要区别在于应该使用它们。

stopIfnot旨在停止执行,如果在assertError旨在测试您的代码的运行期间未满足某些条件。

assertError期望它引发错误的参数,这是在未定义x时发生的错误

> length(x) != 7
Error: object 'x' not found

当您将此表达式传递给assertError时,它会引发错误并且assertError会返回满足的条件(错误本身)。这允许您测试代码的失败案例。

所以assertError主要用于测试驱动开发模式(TDD)的测试用例,当你的代码/函数应该引发某些特定参数的错误并确保你以后更新函数时'不要打破它。

stopifnotassertError的使用示例:

mydiv <- function(a,b) {
  stopifnot(b>0)
  a/b
}

现在让我们进行测试以确保如果我们将“b”传递为0:

会引发错误
tryCatch(
  assertError(mydiv(3,0)),
  error = function(e) { print("Warning, mydiv accept to divide by 0") }
)

运行此代码不会产生任何输出,也不会产生所需的行为。

现在,如果我们像这样评论mydiv中的stopifnot:

mydiv <- function(a,b) {
  #stopifnot(abs(b)>0)
  a/b
}

再次测试tryCatch块,我们得到这个输出:

[1] "Warning, mydiv accept to divide by 0"

这是测试函数的一个小例子,实际上是按预期抛出错误。

tryCatch块只是用不同的消息展示,我希望这能更好地说明这个主题。