【问题标题】:Override variables while testing a standalone Perl script测试独立 Perl 脚本时覆盖变量
【发布时间】: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”声明的脚本中的变量吗?


请不要跳入诸如“从头开始重新编写脚本”之类的答案。这可能是最好的解决方案,但它不能回答我的问题,我们也不会没有时间/资源来重写。

【问题讨论】:

    标签: perl testing


    【解决方案1】:

    如果你想保持变量的词法(如果有用它们构建的闭包),你可以使用模块PadWalker 来查看。

    在旧代码中包含这样的内容:

    package somepackage;
    
    use PadWalker qw/peek_my/;
    
    my $x = 1;
    # big my block declaration...
    
    our $lexpad = peek_my 0;
    

    然后在您的测试代码中:

    ${ $somepackage::lexpad->{'$x'} } = 2;
    

    【讨论】:

    • 完美运行,对原始脚本的改动很小。
    【解决方案2】:

    如果脚本有 package 声明(或者如果您可以添加一个而不更改脚本的行为),那么您可以将 my 声明更改为 our 声明,并使用完全限定变量名。

    旧脚本:

    my($a,@b,$c,%d);
    

    改为:

    package Some::Package;
    our($a,@b,$c,%d);
    

    在你的测试脚本中:

    sub_from_other_script();
    $Some::Package::c = 42;
    $Some::Package::d{$key} = $value;
    sub_from_other_script();
    

    【讨论】:

    • 如果旧脚本是独立脚本,添加包名并使用our 来确定变量范围总是安全的。
    • 脚本没有包声明。不过我可能会尝试添加一个...
    • 没有包声明(但仍在更改my --> our),我怀疑您可以从测试脚本中操纵$main::var_from_other_script
    • 添加包声明是重构此模块的(漫长)道路上良好的第一步。一旦你开始对代码进行命名空间,你就可以开始将一个巨大的脚本分成几个稍微小的脚本,放在它们自己的命名空间中,这些脚本应该开始成为真正的模块。
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2010-12-12
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多