Как я могу оптимизировать завершение done_testing в TAP и оценку результатов в тесте на perl?
У нас есть проект, в котором мы запускаем пару тестов продолжительностью около 3 часов. И я заметил, что на этапе получения результатов теряется много минут. Например: у меня есть этот скрипт
harness.pl
use strict;
use TAP::Harness;
use TAP::Formatter::HTML;
use TAP::Formatter::Console;
# Define Tests
my $tests = {
"test_1" => {
test => 'script.t',
args => ['--server', "server_1"]
},
# "test_2" => {
# test => 'script.t',
# args => ['--server', "server_2"]
# },
};
# Get arguments
my $test_args = {};
$test_args->{$_} = $tests->{$_}->{args} foreach (sort keys %$tests);
# Define formatter
# my $fmt = TAP::Formatter::HTML->new();
# $fmt->output_file( "report.html" );
my $fmt = TAP::Formatter::Console->new({verbosity=>1});
# Start testing
my $harness = TAP::Harness->new( {
test_args => $test_args,
formatter => $fmt,
merge => 1,
jobs => 1,
} );
my $result = $harness->runtests(get_tests($tests));
print( "$0 Run Time: " . ( time - $^T ) . " second(s).\n");
print "Passed: ". scalar $result->passed . "\n";
print "Failed: ". scalar $result->failed . "\n";
print "Errors: ". scalar $result->has_errors . "\n";
sub get_tests{
my ($tests) = @_;
my @tests_to_run;
TEST: foreach my $test (sort keys %$tests){
# some filtering...
push @tests_to_run, [$tests->{$test}->{test}, $test]
}
# some prints...
return @tests_to_run;
}
И пара тестов, давайте возьмем пример следующего
use strict;
use warnings;
use Test::More;
use Getopt::Long qw(GetOptions);
my ($server);
GetOptions(
'server|s=s' => \$server,
) or die "[ERROR] Invalid options passed to $0\n";
my $number_of_tests = 100000;
plan tests => 2 + $number_of_tests;
ok (1, "start");
foreach my $test_nr (0..$number_of_tests-1){
ok(1,"Test numbber: $test_nr in $server");
}
ok ($server eq 'server_1', "Finished");
done_testing;
print( "$0 Run Time: " . ( time - $^T ) . " second(s).\n");
Теперь запускаю тесты с отчетами HTML:
# Define formatter
my $fmt = TAP::Formatter::HTML->new();
$fmt->output_file( "report.html" );
И я получаю следующие результаты:
ok 100002 - Готовый скрипт. t
Время выполнения: 34 секунды.harness.pl Время работы: 42 секунды.
Пройдено: 100002
Не удалось: 0
Ошибок: 0
Итак, через 8 секунд после завершения скрипта.
После этого я попытался использовать форматировщик консоли по умолчанию:
# Define formatter
my $fmt = TAP::Formatter::Console->new({verbosity=>1});
И результат:
ok 100002 - Готовый скрипт. t
Время выполнения: 34 секунды.
ОК
Все тесты прошли успешно.
Файлы =1, Тесты =100002, 34 секунды настенного времени (16,20 usr + 3,61 sys = 19,81 ЦП)
Результат: ПРОЙДЕН harness.pl
Время работы: 34 секунды.
Пройдено: 100002
Не удалось: 0
Ошибок: 0
Это выглядит неплохо, это заставляет меня думать, что проблема связана с созданием действительно большого HTML-отчета, который в этом примере генерирует
Поэтому я выхожу за рамки этого простого примера и перехожу к своему проекту. И запустите упрощенную версию моего теста, которая генерирует отчет, подобный следующему:Как видите, это не уйма тестов, всего около 35 с файлом
А затем я смотрю журналы с той же структурой, где я печатаю последнюю строку скрипта, и получаю такую резкую разницу во времени:
t / long-test.t Время работы: 117 секунд.
# Похоже, вы провалили 2 теста из 34.
Пройдено: 32
Не выполнено: 2
Ошибки: 2
Время выполнения Harness.pl: 212 секунд.
Я снова думаю, хорошо, что что-то не так с этой HTML-библиотекой. Итак, я полностью использую его, удаляю отчет HTML и использую только средство форматирования консоли:
# в t / mylongtest.t, строка 237.
t / mylongtest.t Время выполнения: 128 секунд.
# Похоже, вы провалили 2 теста из 34.
Сомнительно, тест вернул 2 (wstat 512, 0x200)
Неудачные 2/34 подтестовСводный отчет о тестировании
-------------------
mylongtest (Wstat: 512 Тесты: 34 Неудачные: 2)
Неудачные тесты: 33-34
Ненулевое состояние выхода: 2
файла =1, Tests=34, 215 wallclock secs (0,22 usr + 0,12 sys = 0,34 CPU)
Результат: FAIL
Пройдено: 32
Ошибка: 2
ошибки: 2
Время работы Harness.pl: 216 секунд (с).
И снова я получаю резкую разницу со 128 секунд после окончания теста до 216 секунд в конце ремня безопасности.
Я попытался полностью удалить скрипт ремня безопасности и просто использовать доказательство, и я получил то же самое
Так что мой вопрос. Что происходит между done_testing / завершением теста и отчетом о результатах тестовой оснастки и что я могу сделать, чтобы это улучшить?