Как может я функции Perl модульного теста, которые печатают на экран?

Оба. Сделайте некоторое интеграционное и поблочное тестирование на своем сервере разработки (который, идеально, должен быть максимально подобным Вашему живому серверу, но локальным), затем сделайте некоторые приемочные испытания в среде QA, которая должна или быть той же машиной как Ваш живой сервер, или точно та же установка (аппаратные средства, программное обеспечение, и т.д.) и должна быть удаленной.

Когда дело доходит до части базы данных вопроса, Вы могли также:

  • у каждого есть Ваша собственная копия базы данных, ИЛИ
  • сохраняют данные/структуру в синхронизации путем выполнения централизованного сценария (возможно, как часть сборки)
34
задан Sinan Ünür 8 October 2009 в 15:04
поделиться

3 ответа

ОБНОВЛЕНИЕ: ИМХО, правильным ответом на этот вопрос должно быть использование Test :: Output :

#!/usr/bin/perl

use strict; use warnings;

use Test::More tests => 1;
use Test::Output;

sub myfunc { print "This is a test\n" }

stdout_is(\&myfunc, "This is a test\n", 'myfunc() returns test output');

Output:

C:\Temp> tm
1..1
ok 1 - myfunc() returns test output

Я ухожу исходный ответ для справки, поскольку я считаю, что он все еще иллюстрирует полезную технику .

Вы можете локализовать STDOUT и снова открыть скаляр перед вызовом функции, восстановить после:

#!/usr/bin/perl

use strict; use warnings;

use Test::More tests => 1;

sub myfunc { print "This is a test\n" }

sub invoke {
    my $sub = shift;
    my $stdout;
    {
        local *STDOUT;
        open STDOUT, '>', \$stdout
            or die "Cannot open STDOUT to a scalar: $!";
        $sub->(@_);
        close STDOUT
            or die "Cannot close redirected STDOUT: $!";
    }
    return $stdout;
}

chomp(my $ret =  invoke(\&myfunc));

ok($ret eq "This is a test", "myfunc() prints test string" );
diag("myfunc() printed '$ret'");

Выходные данные :

C:\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'

Для версий perl старше 5.8 вам, вероятно, потребуется использовать IO :: Scalar , но я мало знаю, как все работало до 5.8.

32
ответ дан 27 November 2019 в 17:04
поделиться

Я бы хотел позволить модулю сделать это за вас. Посмотрите на Capture :: Tiny .

7
ответ дан 27 November 2019 в 17:04
поделиться

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

sub my_print {
     my $self = shift;
     my $fh = $self->_get_output_fh;
     print { $fh } @_;
     }

sub _get_output_fh { $_[0]->{_output}  || \*STDOUT }
sub _set_output_fh { $_[0]->{_output} = $_[1] } # add validation yourself

При тестировании вы можете вызвать _set_output_fh , чтобы передать ему свой дескриптор файла для тестирования (возможно, даже IO :: Null ручка). Когда другой человек хочет использовать ваш код, но захватить результат, ему не нужно наклоняться назад, чтобы сделать это, потому что он может предоставить свой собственный дескриптор файла.

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

6
ответ дан 27 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: