在Perl中,通常使用一组测试模块包:Test::Simple,Test::More,以及像Test::Class,Test::Most这样的复杂框架。基本的是Test::More——它提供了丰富的功能集:相等检查,结构比较,异常测试等。
流行模块的分类:
Test::Simple——用于非常简单的初始测试;Test::More——大多数项目的事实标准;Test::Exception,Test::Deep,Test::Warn——用于检查额外的方面(异常,嵌套结构,警告);Test::Class,Test::Class::Moose——面向对象的方法。使用Test::More的测试示例:
use Test::More tests => 2; is(2 + 2, 4, '求和正常'); like('foo_bar', qr/foo/, '包含foo');
最佳实践:
可以不使用Test::*模块,仅用die/print结构在Perl中编写自己的测试吗?这样做有什么风险?
答案: 从形式上说是可以的——可以使用print和die来输出结果来编写自己的“测试”。但是在这种情况下,无法形成正确的自动化方法:不支持TAP/CPAN集成,难以生成报告和分析大量测试,难以扩展和维护测试基础。
失败测试的示例:
print '乘法通过 ' if multi(2,3) == 6; die '失败' if multi(2,0) != 0;
故事
在一个旧项目中,测试是通过die和print“手动”编写的。无法自动集成CPAN模块的构建——脚本未返回明确状态,测试错误因此在发布中被忽略。
故事
尝试在不考虑TAP(测试任何协议)结构的情况下混合使用Test::Simple和Test::More,导致输出中断,自动测试系统失败。需要重做测试基础设施。
故事
Test::Exception缺乏良好的测试覆盖,导致多个输入数据处理错误被忽视:一个模块错误地抛出了异常,未在测试中被发现,缺陷进入了生产环境。