gpt4 book ai didi

perl - 在测试独立的 Perl 脚本时覆盖变量

转载 作者:行者123 更新时间:2023-11-28 19:48:51 24 4
gpt4 key购买 nike

我现在需要维护我们环境中的 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() );

不幸的是(对我来说),我正在测试的脚本在顶部有一个巨大的“我的” block ,它声明了脚本中使用的所有变量。这可以防止我的测试脚本看到/更改我正在运行测试的脚本中的变量。

我玩过 Exporter、Test::Mock... 和其他一些模块,但看起来如果我想能够更改任何变量,我将不得不以某种方式修改其他脚本.

我的目标是不更改其他脚本,而是运行一些良好的测试,这样当我开始更改其他脚本时,我可以确保我没有破坏任何东西。脚本大约有 10,000 行(其中 3,000 行在主 block 中),所以我担心如果我开始更改内容,我会影响代码的其他部分,因此拥有一个好的测试套件会有所帮助。

这可能吗? 调用脚本可以修改另一个用“my”声明的脚本中的变量吗?


并且请不要插手回答,例如“从头开始重写脚本”等。这可能是最好的解决方案,但它没有回答我的问题,我们也没有没有时间/资源重写。

最佳答案

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

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

package somepackage;

use PadWalker qw/peek_my/;

my $x = 1;
# big my block declaration...

our $lexpad = peek_my 0;

然后在你的测试代码中:

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

关于perl - 在测试独立的 Perl 脚本时覆盖变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com