【发布时间】:2010-04-13 14:52:48
【问题描述】:
在我们的环境中有一个 Perl 脚本,我现在需要维护它。它充满了不好的做法,包括在整个脚本中使用(和重用)全局变量。在我开始对脚本进行更改之前,我打算尝试编写一些测试脚本,这样我就可以拥有一个良好的回归基础。为此,我将使用page 中描述的方法。
我从为单个子例程编写测试开始。我将这一行放在我正在测试的脚本的顶部附近:
return 1 if ( caller() );
这样,在我的测试脚本中,我可以
require 'script_to_test.pl';
它不会执行整个脚本。
我要测试的第一个子例程大量使用了在整个脚本中设置的全局变量。我的想法是尝试在我的测试脚本中覆盖这些变量,如下所示:
require_ok('script_to_test.pl');
$var_from_other_script = 'Override Value';
ok( sub_from_other_script() );
不幸的是(对我来说),我正在测试的脚本顶部有一个巨大的“我的”块,它声明了脚本中使用的所有变量。这可以防止我的测试脚本看到/更改我正在对其运行测试的脚本中的变量。
我使用过 Exporter、Test::Mock... 和其他一些模块,但看起来如果我想能够更改任何变量,我将不得不以某种方式修改其他脚本.
我的目标是不更改其他脚本,而是让一些好的测试运行,所以当我开始更改其他脚本时,我可以确保我没有破坏任何东西。脚本大约有 10,000 行(其中 3,000 行在主块中),所以我担心如果我开始更改内容会影响代码的其他部分,因此拥有一个好的测试套件会有所帮助。
这可能吗? 调用脚本可以修改另一个用“my”声明的脚本中的变量吗?
请不要跳入诸如“从头开始重新编写脚本”之类的答案。这可能是最好的解决方案,但它不能回答我的问题,我们也不会没有时间/资源来重写。
【问题讨论】: