查看源代码 assert.hrl
断言宏。
描述
包含文件 assert.hrl
提供了用于在程序代码中插入断言的宏。
在调用该函数的模块中包含以下指令
-include_lib("stdlib/include/assert.hrl").
当断言成功时,assert 宏会产生原子 ok
。当断言失败时,会生成一个类型为 error
的异常。相关的错误项的形式为 {Macro, Info}
。Macro
是宏的名称,例如 assertEqual
。Info
是一个带标签的值的列表,例如 [{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
引发不同的异常或正常完成并返回任何值,则断言失败。请注意,
Class
和Term
都可以是守卫模式,如assertMatch
中一样。assertNotException(Class, Term, Expr)
assertNotException(Class, Term, Expr, Comment)
- 测试Expr
没有异常完成,出现类型为Class
且具有相关Term
的异常。如果Expr
引发不同的异常或正常完成并返回任何值,则断言成功。如
assertException
中一样,Class
和Term
都可以是守卫模式。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)