这是测试Perl代码的好方法吗?

Geo*_*Geo 1 testing perl unit-testing

我正在编写一个具有处理文本文件的函数的模块.我是新手测试,所以我决定一起去Test::More.这是我的测试文件现在的样子:

use mymod;
use 5.10.0;
use strict;
use warnings;
use Test::More 'no_plan';

my $file_name = "test.file";

sub set_up {
    my $self = shift;
    open(my $handle,">",$file_name) or die "could not create file test.file $!\n";
    # generate a sample text file here
    close($handle);
}

sub tear_down {
    my $self = shift;
    unlink($file_name) or die "could not delete $file_name $!\n";
}

set_up();

open(my $handle,$file_name) || die "could not open $file_name $!\n";

my @lines = mymod->perform($handle);

is_deeply(\@lines,["expected line","another expected line"]);

close($handle);

tear_down();
Run Code Online (Sandbox Code Playgroud)

这是进行测试的好方法吗?在我的测试中处理生成样本输入文件是否可以?

顺便说一下,我开始把它写成Test::Unit测试,然后切换到Test::More.这就是为什么set_uptear_down功能都存在的原因.

Eth*_*her 8

您可以将字符串"打开"为文件句柄,因此您仍然可以为文件句柄提供方法,但不必创建物理文件.这样您就可以将测试内容放在一个字符串中(理想情况下是一个字符串数组,每个数据样本一个用于测试),而不必创建临时文件:

my @testdata = (
    "test data 1",
    "test data 2",
    # ...
);

foreach my $data (@testdata)
{
    open my $datahandle, "<", \$data or die "Cannot open handle to string: $!";
    my @lines = mymod->perform($datahandle);
    # ...
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*ans 5

使用Test :: More的'no_plan'选项使测试不太可靠:你不能真正知道你是否因某种原因错过了测试.最好计划预定义数量的测试,或者如果不可能,则可以使用done_testing函数(但需要最新版本的Test :: More).

ETA:我没有看到你使用open-close-open-close-unlink的事情.我认为你可以更好地打开一个临时文件,填写它并将其用于你的测试.

  • 生成一个文本文件作为测试的一部分是可以的,但如果你的代码有bug,那么你的测试结果就不可信了.通常,如果可能的话,最好有一个具有已知内容的预定义测试文件. (4认同)