单元测试 .pl Perl 文件

Unit-testing a .pl Perl file

我是 Perl 的新手,但我正在尝试向 Sanoid (https://github.com/jimsalterjrs/sanoid) 添加一些功能,它是用 Perl 编写的单个脚本,没有 .pm 模块文件(据我了解这些东西)。

我想将一些简单的单元测试添加到我添加的新子例程中,我希望能够像在 Python 中一样轻松地完成此操作,您只需 import其他文件的名称和测试子例程 return 来自各种输入的值。

我已经阅读了很多测试教程,并认为我遵循了如何进行实际测试,但我在导入我想要测试的脚本的第一个障碍上苦苦挣扎。

据我所知,导入内容的主要方法是将其转换为 .pm 模块,然后 use,但我不想仅仅为了测试而尝试重新构建某人的代码(特别是当我对 Perl 很陌生)。替代方案似乎是 requiredo 文件,据我所知,这将执行文件(这并不理想,因为即使在没有参数的情况下调用它也会做事)并且意味着我需要添加一个1; 到文件末尾以确保它 return 在需要时为真。

看起来我可以使用 unless (caller) 重新排列内容,以便在 required 时不执行任何操作,但我想检查一下我没有遗漏任何明显的内容。

这里 Perl 和 Python 真的没有区别。就像在 Python 中一样,在 Perl 中加载文件作为模块执行它。

但是就像在 Python 中一样,您可以检查模块是否作为脚本在 Perl 中执行。

# Python
if __name__ == "__main__":
   main()
# Perl
main() if !caller();

这样的文件称为“modulino”。

也就是说,我不喜欢这种做法(无论哪种语言)。如果你想要一个模块,写一个模块。这只是我的意见。

嘿,很久以前我不得不为人们转换一堆东西时为此制作了一个工具:scriptdist。这是在程序上使用 Perl 工具链的快速修复。

然后的诀窍是能够加载脚本而不做任何事情,直到你的测试要求它,这就是 你将所有 top-level 代码包装在一个子例程中的地方,并且只有当 perl 认为文件 运行 作为程序时才调用它。

我已经写了很多相关内容: