Оба. Сделайте некоторое интеграционное и поблочное тестирование на своем сервере разработки (который, идеально, должен быть максимально подобным Вашему живому серверу, но локальным), затем сделайте некоторые приемочные испытания в среде QA, которая должна или быть той же машиной как Ваш живой сервер, или точно та же установка (аппаратные средства, программное обеспечение, и т.д.) и должна быть удаленной.
Когда дело доходит до части базы данных вопроса, Вы могли также:
ОБНОВЛЕНИЕ: ИМХО, правильным ответом на этот вопрос должно быть использование 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.
Я бы хотел позволить модулю сделать это за вас. Посмотрите на Capture :: Tiny .
Если это код, который вы пишете самостоятельно, измените его так, чтобы операторы печати не использовали дескриптор файла по умолчанию. Вместо этого дайте себе способ установить для выходного дескриптора файла любое значение:
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 ручка). Когда другой человек хочет использовать ваш код, но захватить результат, ему не нужно наклоняться назад, чтобы сделать это, потому что он может предоставить свой собственный дескриптор файла.
Когда вы находите часть вашего кода, которую трудно протестировать или что вы должны прыгать через обручи, чтобы работать, вероятно, у вас плохой дизайн. Я до сих пор удивляюсь тому, как тестовый код делает эти вещи очевидными, потому что я часто не думал о них. Если это сложно проверить, сделайте это легко.