查看源代码 assert.hrl

断言宏。

描述

包含文件 assert.hrl 提供了用于在程序代码中插入断言的宏。

在调用该函数的模块中包含以下指令

-include_lib("stdlib/include/assert.hrl").

当断言成功时,assert 宏会产生原子 ok。当断言失败时,会生成一个类型为 error 的异常。相关的错误项的形式为 {Macro, Info}Macro 是宏的名称,例如 assertEqualInfo 是一个带标签的值的列表,例如 [{module, M}, {line, L}, ...],其中提供了关于异常的位置和原因的更多信息。 Info 列表中的所有条目都是可选的;不要以编程方式依赖于它们的任何存在。

每个断言宏都有一个带有额外参数的对应版本,用于向断言添加注释。例如,这些可以作为错误报告的一部分打印,以阐明失败的检查的含义。例如,?assertEqual(0, fib(0), "Fibonacci is defined for zero")。注释文本可以是任何字符数据(字符串、UTF8 二进制文件或此类数据的深层列表),并且将作为 {comment, Text} 包含在错误项中。

如果在编译器读取 assert.hrl 时定义了宏 NOASSERT,则这些宏将被定义为等同于原子 ok。将不会执行测试,并且运行时没有开销。

例如,使用 erlc 编译你的模块,以下内容将禁用所有断言

erlc -DNOASSERT=true *.erl

NOASSERT 的值并不重要,重要的是它被定义了。)

一些其他宏也会影响断言的启用或禁用

  • 如果定义了 NODEBUG,则表示 NOASSERT(除非也定义了 DEBUG,这会覆盖 NODEBUG)。
  • 如果定义了 ASSERT,则会覆盖 NOASSERT,即断言仍然启用。

因此,如果你愿意,你可以只使用 DEBUG/NODEBUG 作为控制断言行为的主要标志(如果你有其他由这些标志控制的编译器条件或调试宏,则很有用),或者你可以使用 ASSERT/NOASSERT 仅控制断言宏。

  • assert(BoolExpr)

  • assert(BoolExpr, Comment) - 测试 BoolExpr 正常完成并返回 true

  • assertNot(BoolExpr)

  • assertNot(BoolExpr, Comment) - 测试 BoolExpr 正常完成并返回 false

  • assertMatch(GuardedPattern, Expr)

  • assertMatch(GuardedPattern, Expr, Comment) - 测试 Expr 正常完成,产生一个与 GuardedPattern 匹配的值,例如

    ?assertMatch({bork, _}, f())

    请注意,可以包含一个守卫 when ...

    ?assertMatch({bork, X} when X > 0, f())
  • assertNotMatch(GuardedPattern, Expr)

  • assertNotMatch(GuardedPattern, Expr, Comment) - 测试 Expr 正常完成,产生一个与 GuardedPattern 不匹配的值。

    assertMatch 中一样,GuardedPattern 可以有一个 when 部分。

  • assertEqual(ExpectedValue, Expr)

  • assertEqual(ExpectedValue, Expr, Comment) - 测试 Expr 正常完成,产生一个与 ExpectedValue 完全相等的值。

  • assertNotEqual(ExpectedValue, Expr)

  • assertNotEqual(ExpectedValue, Expr, Comment) - 测试 Expr 正常完成,产生一个与 ExpectedValue 不完全相等的值。

  • assertException(Class, Term, Expr)

  • assertException(Class, Term, Expr, Comment) - 测试 Expr 异常完成,出现类型为 Class 且具有相关 Term 的异常。如果 Expr 引发不同的异常或正常完成并返回任何值,则断言失败。

    请注意,ClassTerm 都可以是守卫模式,如 assertMatch 中一样。

  • assertNotException(Class, Term, Expr)

  • assertNotException(Class, Term, Expr, Comment) - 测试 Expr 没有异常完成,出现类型为 Class 且具有相关 Term 的异常。如果 Expr 引发不同的异常或正常完成并返回任何值,则断言成功。

    assertException 中一样,ClassTerm 都可以是守卫模式。

  • assertError(Term, Expr)

  • assertError(Term, Expr, Comment) - 等效于 assertException(error, Term, Expr)

  • assertExit(Term, Expr)

  • assertExit(Term, Expr, Comment) - 等效于 assertException(exit, Term, Expr)

  • assertThrow(Term, Expr)

  • assertThrow(Term, Expr, Comment) - 等效于 assertException(throw, Term, Expr)

另请参阅

compile, erlc(3)