1

我已经开始编写一个可以用来汇总数据的模块。我是测试新手,虽然我已经阅读了我能找到的内容并在谷歌上搜索,但我找不到关于如何最好地测试需要一些输入数据才能有意义的方法和子程序的建议(假设我会使用大约 100 行制表符分隔的文本文件)。

我应该只在分发中包含文本文件吗?我已经检查了 Text::CSV ,这就是它在那里完成的方式。

有什么建议吗?

非常感谢

4

1 回答 1

2

我建议结合使用Test::More作为您的测试框架和嵌入内联数据。

Test::More是 Perl 中的标准测试工具包;几乎您可能会发现的所有测试工具都使用它。它带有许多方便的内置测试功能。

通常,您通过将预期值与子程序或工具实际给出的值进行比较来进行测试。最常见的方法是使用is例程进行直接比较。它的格式如下所示:

is($got, $expected, $test_name);

例如,假设我们创建了一个 POW 函数,并希望确保它正常工作:

sub pow { my ($n, $p) = @_;  return $n ** $p; }

我们将通过以下方式检查:

is( pow(2, 3), 8, "2^3 is 8" );
is( pow(2, 4), 16, "2^4 is 16" );
is( pow(3, 3), 27, "3^3 is 27" );

然后归结为以对您有用的格式获取您需要的数据。小数据可能会使用 Heredocs 与您的测试函数调用一起加载:

my $test1 = <<'END_DATA1';
... (your data here
END_DATA1

my $test2 = <<'END_DATA2';
... (your second dataset here
END_DATA2

或者,如果您需要检查一个大数据集的多个部分,您可以考虑将其全部放入__DATA__块中:

while (my $line = <DATA>) { ... } # read from the DATA handle

# ... your script above here; everything below __DATA__ is read from the handle
__DATA__  
... ( your data set here )

例如,如果你想确保你的子程序正确地读入一行,它可能是这样的:

use strict;
use warnings;
use Test::More;

use Your::Lib;  # load your library with your routines in it

use Test::More tests => 5; # how many checks you will perform, in case it dies

my $lib = your_lib_function(\*DATA);  # say, it loads from a file handle maybe?

is( $lib->key1(), 'value', "Key 1 was read correctly.");
is( $lib->key2(), 'value2', "Key 2 was read correctly.");
is( $lib->key3(), 'value3', "Key 3 was read correctly.");
is( $lib->key4(), 'value4', "Key 4 was read correctly.");
is( $lib->key5(), 'value5', "Key 5 was read correctly.");

__DATA__
{
    "Key" : "value",
    "Key2" : "value2",
    "Key3" : "value3",
    "Key4" : "value4",
    "Key5" : "value5",
}

查看Test::More有关此框架如何工作的更多详细信息。祝你好运!:)

于 2013-01-09T23:14:51.877 回答