Как я могу оптимизировать завершение 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-отчета, который в этом примере генерирует 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 / завершением теста и отчетом о результатах тестовой оснастки и что я могу сделать, чтобы это улучшить?

0 ответов

Другие вопросы по тегам