如何让prove工具显示Perl测试脚本的具体错误信息?
如何让prove工具显示Perl测试脚本的详细错误信息
问题场景
先看一个简单示例:创建一个包含语法错误的测试脚本:
$ echo 'foo+' > t1.t
直接用Perl运行时,能看到明确的错误提示:
$ perl t1.t syntax error at t1.t line 1, at EOF Execution of t1.t aborted due to compilation errors.
但用prove工具运行时,仅返回模糊的失败汇总,看不到具体错误原因:
$ prove -v t1.t Dubious, test returned 255 (wstat 65280, 0xff00) No subtests run Test Summary Report ------------------- t1.t (Wstat: 65280 Tests: 0 Failed: 0) Non-zero exit status: 255 Parse errors: No plan found in TAP output Files=1, Tests=0, 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) Result: FAIL
实际场景中,我有一个复杂的t1.t测试脚本,直接用Perl运行完全正常,但用prove运行就失败,需要找到查看具体失败原因的方法。
补充调试信息(翻译后)
$ prove --merge -v t1.t 在t1.t第12行的字符串操作中使用了未初始化的值$config_path 无法加载模块Test::More: 无法找到Test/More.pm in @INC (@INC包含: /usr/local/lib/perl5/site_perl/5.30.0/x86_64-linux /usr/local/lib/perl5/site_perl/5.30.0 /usr/lib/perl5/vendor_perl/5.30.0/x86_64-linux /usr/lib/perl5/vendor_perl/5.30.0 /usr/lib/perl5/5.30.0/x86_64-linux /usr/lib/perl5/5.30.0 .) at t1.t line 5. BEGIN failed--compilation aborted at t1.t line 5. Dubious, test returned 255 (wstat 65280, 0xff00) No subtests run Test Summary Report ------------------- t1.t (Wstat: 65280 Tests: 0 Failed: 0) Non-zero exit status: 255 Parse errors: No plan found in TAP output Files=1, Tests=0, 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) Result: FAIL
注:以上为原英文调试信息的中文翻译,还原了脚本运行时的依赖报错与变量警告。
解决方法
1. 合并标准错误与标准输出
prove默认会捕获测试脚本的标准错误(STDERR),使用--merge选项可以将STDERR与标准输出(STDOUT)合并显示,从而看到Perl抛出的具体错误:
prove --merge -v t1.t
2. 传递Perl参数给prove
可以让prove直接将参数传递给Perl解释器,比如启用警告、调试模式:
- 启用全量警告:
prove --perl-option '-Wall' t1.t - 启动Perl调试器逐步排查:
prove -d t1.t
3. 检查环境差异
直接用Perl运行和prove运行的环境可能存在差异(比如PERL5LIB模块路径、PERLOPT选项),可以通过以下命令对比:
- 查看
prove使用的Perl环境:prove -V - 查看直接运行Perl的环境:
perl -V
如果发现模块路径不一致,可以手动指定路径后再运行prove:
PERL5LIB=$(perl -e 'print join(":", @INC)') prove --merge -v t1.t
4. 检查prove的默认选项
prove默认可能启用了一些Perl不会默认开启的选项(比如污点模式-T),可以通过prove --help查看所有默认行为,或者显式禁用相关选项:
prove --no-taint t1.t
内容的提问来源于stack exchange,提问作者Eugen Konkov
相关产品推荐
相关产品推荐

