SuperAPI AI 工具集

perl-testing

测试与质量

查看项目

更新于 10-15 10:36

技能介绍

Perl Testing Patterns 是一套面向 Perl 应用的测试策略集合,覆盖 Test2::V0、Test::More、prove 运行器与 TDD 方法。

用途与触发场景

在编写新的 Perl 代码时(遵循 TDD:红、绿、重构);设计 Perl 模块或应用的测试套件;审查 Perl 测试覆盖率;搭建 Perl 测试基础设施;将测试从 Test::More 迁移到 Test2::V0;调试失败的 Perl 测试。

TDD 工作流

始终遵循 RED-GREEN-REFACTOR 循环。第一步 RED:写一个失败的测试,例如在 t/unit/calculator.t 中使用 Test2::V0 的 subtest 与 is 断言,并以 done_testing 结束。第二步 GREEN:写最小实现,例如 lib/Calculator.pm 中返回 $a + $b。第三步 REFACTOR:在测试保持通过的前提下改进代码,运行 prove -lv t/unit/calculator.t。

Test::More 基础

Test::More 是标准 Perl 测试模块,广泛使用并随核心发布。提供 plan 或 done_testing;相等断言 is/isnt;布尔断言 ok;深度比较 is_deeply;模式匹配 like/unlike;类型检查 isa_ok/can_ok。可用 SKIP 块按条件跳过测试,用 TODO 块标记预期失败。

Test2::V0 现代框架

Test2::V0 是 Test::More 的现代替代,具有更丰富的断言、更好的诊断信息和可扩展性。优势包括:更强的深度比较与 hash/array 构建器;失败时更好的诊断输出;更清晰作用域的子测试;可通过 Test2::Tools::* 插件扩展;与 Test::More 测试向后兼容。深度比较支持 hash 构建器(字段匹配、match、validator、etc())、array 构建器(含 DNE() 验证无额外项)、bag(与顺序无关)。子测试用 subtest 分组,异常测试使用 dies/lives 断言。

测试组织与 prove

建议目录结构:t/ 下含 00-load.t、01-basic.t、unit/、integration/、lib/TestHelper.pm、fixtures/。prove 命令示例:prove -l t/ 运行全部;prove -lv t/ 详细输出;prove -lv t/unit/user.t 运行单个;prove -lr t/ 递归;prove -lr -j8 t/ 并行;prove -l --state=failed t/ 仅运行上次失败的测试;prove -l --color --timer t/ 彩色与计时;prove -l --formatter TAP::Formatter::JUnit t/ > results.xml 输出 TAP 供 CI。也可使用 .proverc 配置。

Fixtures 与隔离

使用 File::Temp 的 tempdir(CLEANUP => 1) 等实现子测试隔离与自动清理;将可复用辅助函数放入 t/lib/TestHelper.pm,通过 use lib 't/lib' 加载,并用 Exporter 导出 create_test_db()、create_temp_dir()、fixture_path() 等工厂函数。

模拟

使用 Test::MockModule 模拟外部 API,返回受控数据并验证调用次数,模块在 $mock 离开作用域时自动恢复;避免无恢复的 monkey-patching。轻量模拟对象可用 Test::MockObject 创建可注入的测试替身,用 ->mock() 与 ->called_ok() 验证调用。

覆盖率

使用 Devel::Cover:cover -test 运行覆盖率;或 perl -MDevel::Cover -Ilib t/unit/user.t 后运行 cover;cover -report html 生成 HTML 报告并在浏览器打开;可在 CI 中设置阈值失败,例如解析 text 报告中的 Total 值并在低于 80 时退出 1。

集成测试

数据库测试可用内存 SQLite(dbi:SQLite:dbname=:memory:)建表、插入并查询验证;API 测试可模拟 HTTP::Tiny。

最佳实践

建议:遵循 TDD;使用 Test2::V0;使用子测试分组隔离状态;模拟外部依赖(网络、数据库、文件系统);prove -l 始终包含 lib/;命名清晰;测试边界情况(空字符串、undef、零、边界值);以 80%+ 覆盖率为目标;保持测试快速。避免:测试实现细节而非行为;子测试间共享状态;遗漏 done_testing;过度模拟;新项目使用 Test::More;忽略失败;测试 CPAN 模块;编写脆弱测试。

常见陷阱

忘记 done_testing 可能导致跳过测试代码时出现静默错误;缺少 -l 标志会报 Can't locate ... in @INC;过度模拟会使测试失去意义;测试污染应使用子测试内的 my 变量而非 our。

限制

资料未提供该技能的具体安装方式、收费或价格信息,也未提供其支持的 Perl 版本范围之外的兼容性保证;具体平台支持暂未提供。