EUnit中debugMsg使用报错及超时测试打印调试方法咨询
Erlang EUnit 常见调试问题解决
一、debugMsg/1 报错"undefined"的解决
debugMsg是EUnit提供的宏,不是普通Erlang函数,出现这个错误大概率是使用方式不对,按以下两点检查:
- 必须在模块开头导入EUnit的头文件:
-include_lib("eunit/include/eunit.hrl"). - 调用时要以宏的方式使用,不要加句点(.)当成函数调用。正确示例:
如果写成debugMsg("This is a debug message"); debugMsg(test_atom); debugMsg(["IO", "list", "message"])debugMsg("msg").,Erlang会把它当成普通函数调用,自然找不到定义。
二、超时测试用例中输出调试信息的方法
EUnit默认会捕获测试用例的IO输出,超时场景下可能无法直接看到io:format的内容,可通过以下方式解决:
- 优先用EUnit自带的debugMsg宏:只要正确导入头文件,这个宏的输出会绕过EUnit的IO捕获,即使测试超时,调试信息也会被打印出来。
- 让EUnit不捕获IO输出:
- 单个测试用例设置:用
{debug, ...}包裹测试用例,示例:timeout_test_() -> {debug, [fun my_timeout_case/0]}. - 全局启动参数:运行EUnit时加上
verbose选项,命令行或代码里都可以:eunit:test(my_module, [verbose]).
- 单个测试用例设置:用
- 输出到文件:如果以上方法都不行,可以直接把调试内容写入文件,避免被EUnit捕获:
{ok, Fd} = file:open("eunit_debug.log", [append]), io:format(Fd, "Timeout debug data: ~p~n", [SomeData]), file:close(Fd).
内容的提问来源于stack exchange,提问作者Piskator
相关产品推荐
相关产品推荐

