Это хороший способ тестирования кода на Perl? - PullRequest
1 голос
/ 28 ноября 2009

Я пишу модуль, который имеет некоторые функции, связанные с текстовыми файлами. Я новичок в тестировании, поэтому я решил пойти с 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();

Это хороший способ выполнения тестов? Можно ли создать образец входного файла в моем тесте?

Кстати, я начал писать это как Test::Unit тест, а затем переключился на Test::More. Вот почему есть функции set_up и tear_down.

Ответы [ 3 ]

8 голосов
/ 28 ноября 2009

Вы можете «открыть» строку как дескриптор файла, так что вы все равно можете передать свой метод дескриптором файла, но не должны создавать физический файл. Таким образом, вы можете поместить ваш тестовый контент в строку (в идеале - массив строк, по одной на каждый образец данных для тестирования) и не создавать временные файлы:

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);
    # ...
}
5 голосов
/ 28 ноября 2009

Использование Test :: More 'no_plan' делает тестирование менее надежным: вы не можете точно знать, пропустили ли вы тестирование по какой-то причине. Лучше всего запланировать заранее определенное количество тестов, или, если это невозможно, вы можете использовать функцию done_testing (но для этого требовалась последняя версия Test :: More).

ETA: я не вижу, что вы делаете, открывайте, закрывайте, закрывайте и отменяйте связь. Я думаю, что вы можете лучше открыть временный файл, заполнить его и использовать его для своих тестов.

2 голосов
/ 28 ноября 2009

Помимо использования no_plan, которое уже прокомментировано:

Что касается создания файла для чтения во время модульного тестирования, это может считаться приемлемым, хотя обычно избегают касаться файлов в модульных тестах (или любых других "медленных" ресурс), потому что это замедляет тесты.

Это может стать проблематичным, если много модульных тестов читает или записывает файл и если количество тестов слишком велико. Действительно, модульные тесты должны быть ненавязчивыми и выполняться в одно мгновение.

Если время выполнения ваших модульных тестов начинает становиться проблемой, вы можете либо извлечь тесты, которые обращаются к файловой системе, и добавить их в набор интеграционных тестов, который вы будете запускать реже, либо изменить свой код для разделения. вне чтения файла и обработки его содержимого. Таким образом, вы можете протестировать обработку содержимого независимо от чтения файла и сохранить данные в виде массива строк в коде вашего модульного теста.

Этот код имеет тенденцию быть более пригодным для повторного использования, поскольку то, что вы читаете сегодня в файле, может быть получено вчера из другого источника (например, сети, БД).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...