我正在构建一个 perl 应用程序作为“模数”以使测试更容易。目录结构如下所示:
MainScript.pm
t/001_load.t
t/002_setup.t
t/003_etc...
每个 .t 测试文件中的第一个测试也加载模块:
BEGIN { use_ok('MainScript'); }
为了进行测试,我在顶级目录中运行以下命令:
prove -l
到目前为止,一切都很好。当我不小心直接运行 .t 测试脚本时,我遇到了一个问题。
我的手指有一个几乎自主的习惯,即在将脚本保存在我的文本编辑器中后立即按热键运行脚本。当我使用其中一个测试文件执行此操作时,它会尽职尽责地运行并全面报告失败。这是意料之中的,因为如果从自己的目录运行它就看不到模块。我担心的是某些测试会写入文件系统。示例是用于验证的配置文件和数据文件。如果它无法加载它应该测试的模块,我的偏好是让测试脚本在它做任何事情之前发出嘶嘶声。这样一来,我就不必担心其他测试会出现任何问题。
我目前正在使用的解决方案是BEGIN { use_ok('MainScript'); }
用标准使用调用替换该行:
use MainScript;
运行测试prove -l
仍然按预期工作。即使删除了 use_ok 测试,它显然没问题,因为文件的其余部分运行。如果由于某种原因,测试找不到模块,它会阻塞并且“证明”仍然显示测试文件失败。如果我直接从编辑器运行脚本,它会在编译时失败,并显示在@INC 中找不到请求的模块的消息。这对我来说似乎是一种可取的行为。
有没有更好的方法来做到这一点,和/或这种方法中有什么东西会咬我吗?