编程Perl开发者,测试工程师

Perl中的测试是如何工作的:有哪些内置和第三方的测试模块,它们有什么区别,以及在Perl项目中广泛使用的测试实践是什么?

用 Hintsage AI 助手通过面试

答案

在Perl中,通常使用一组测试模块包:Test::SimpleTest::More,以及像Test::ClassTest::Most这样的复杂框架。基本的是Test::More——它提供了丰富的功能集:相等检查,结构比较,异常测试等。

流行模块的分类:

  • Test::Simple——用于非常简单的初始测试;
  • Test::More——大多数项目的事实标准;
  • Test::ExceptionTest::DeepTest::Warn——用于检查额外的方面(异常,嵌套结构,警告);
  • Test::ClassTest::Class::Moose——面向对象的方法。

使用Test::More的测试示例:

use Test::More tests => 2; is(2 + 2, 4, '求和正常'); like('foo_bar', qr/foo/, '包含foo');

最佳实践:

  • 所有公共模块应该在t/-目录中有自动测试。
  • 不要将测试数据与生产代码混合。
  • 应用模块测试、集成测试,有时使用基于属性的测试。

有陷阱的问题

可以不使用Test::*模块,仅用die/print结构在Perl中编写自己的测试吗?这样做有什么风险?

答案: 从形式上说是可以的——可以使用printdie来输出结果来编写自己的“测试”。但是在这种情况下,无法形成正确的自动化方法:不支持TAP/CPAN集成,难以生成报告和分析大量测试,难以扩展和维护测试基础。

失败测试的示例:

print '乘法通过 ' if multi(2,3) == 6; die '失败' if multi(2,0) != 0;

由于对主题细节的不熟悉而导致的实际错误示例


故事

在一个旧项目中,测试是通过die和print“手动”编写的。无法自动集成CPAN模块的构建——脚本未返回明确状态,测试错误因此在发布中被忽略。


故事

尝试在不考虑TAP(测试任何协议)结构的情况下混合使用Test::Simple和Test::More,导致输出中断,自动测试系统失败。需要重做测试基础设施。


故事

Test::Exception缺乏良好的测试覆盖,导致多个输入数据处理错误被忽视:一个模块错误地抛出了异常,未在测试中被发现,缺陷进入了生产环境。