gpt4 book ai didi

perl - 在 Perl 单元测试期间更改环境变量

转载 作者:行者123 更新时间:2023-12-03 20:21:15 27 4
gpt4 key购买 nike

我正在尝试为此 perl 模块函数编写一些单元测试,但在环境变量方面存在一些问题。我将首先列出文件,然后更详细地解释问题。

processBuildSubs.pm

package processBuildSubs;
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Status;

# Declare environment variables used in this package that are needed
use constant URI_BASE => $ENV {"URI_BASE"};
use constant URI_RESOURCE => $ENV {"URI_RESOURCE"};

# Shell Environment Related Constants visible.
# Make visible.

our $URI_BASE = URI_BASE;
our $URI_RESOURCE = URI_RESOURCE;

sub populatePartitions
{
# Define locals
my $url;
my $ua = new LWP::UserAgent;

$url = "$URI_BASE"."$URI_RESOURCE"."/some/path";

# Make a request to the $url
$res = $ua->request (GET $url);

if ($res->code() != HTTP::Status->RC_OK() )
{
# The request didn't return 200 OK so it's in here now.
}
else
{
# The request returned 200 OK, so now it's here.
}
}

我希望能够对 if path 进行单元测试和 else path ,但是,如果我不需要更改 processBuildSubs.pm 对我来说是最好的。代码。这是一个我目前无法控制的外部文件。我只是负责对它进行单元测试(尽管我知道如果我们也可以更改源代码,它可以更有效地进行测试)。

所以为了测试这两条路径,我们需要环境变量 URI_BASEURI_RESOURCE进行相应的设置,以便请求失败一次,并再次成功。 (我有兴趣学习如何在 future 取消这个电话,但这留给另一个问题。)

这是我的测试文件:

processBuildSubs.t
use strict;
use Test::More qw(no_plan);

BEGIN { use_ok('processBuildSubs') };

# Test 1 of populatePartitions() function
my $processBuildProdsCall = processBuildSubs::populatePartitions();
is( $populatePartitionsCall, 0, "populatePartitions() Test for 0 Val Passed" );

# Test 2 of populatePartitions() function
# I need to change some environment variables that processBuildSubs depends on here.
my $processBuildProdsCall = processBuildSubs::populatePartitions();
is( $populatePartitionsCall, 0, "populatePartitions() Test for 0 Val Passed" );

我们现在更改环境变量的最佳尝试是使用这样的外部 shell 脚本(但最好在上面文件中的 my 调用之间更改它们):

run_tests.sh
#!/bin/bash

# Run the tests once
perl ./BuildProcess.pl
perl ./Build testcover # Ultimately calls the processBuildSubs.t test file

# Now export some variables so the other test passes.
export URI_BASE="https://some-alias/"
export URI_RESOURCE="some-resource"

# Then run the test suite again with the env set so the else condition passes.
perl ./BuildProcess.pl
perl ./Build testcover

如您所见,这将是一种糟糕的做事方式,因为我们每次都在不同的环境中运行整个测试套件。理想情况下,我们希望在 processBuildSubs.t 中设置我们的环境。如果可能,在测试之间归档。

如果我可以提供任何进一步的信息,请告诉我。

最佳答案

您是否反对为单独的测试环境使用单独的脚本?

# processBuildSubs.t
BEGIN {
@ENV{"URI_BASE","URI_RESOURCE"} = ("https://some-alias/","some-resource");
}
use Test::More;
... tests go here ...
# processBuildSubs-env2.t
BEGIN {
@ENV{"URI_BASE","URI_RESOURCE"} = ("https://another-alias/","another-resource");
}
use Test::More;
... tests go here ...

通过设置 %ENVBEGIN block ,在加载任何其他模块之前,您可以在编译时为其他模块提供不同的环境变量。

关于perl - 在 Perl 单元测试期间更改环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858077/

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