четверг, 11 июня 2009 г.

Загадочное про perl модули а также про то как круто учиться :)

Недавно я выкладывал пост как создавать репорты в ексель на перле
Для этого я написал отдельный перл модуль generateBuildReport.pm
Я не ахти какой перл программер , как говорится , только учусь , поэтому получилось что нашел я у себя критическую ошибку)
При включении моего модуля в код другого перл скрипта

use generateBuildReport.pm;


У меня в этом скрипте начинает некорректно работать функция system в ниже приведенной функции.Perl интерпретатор просто крашится и вылетает при ее выполнении.Надо сказать что в IBM clearquest perl не стандартный, а скомпилированный IBM и называется он cqperl.Возможно в этом дело

#executes selected manual test script in Rational manual tester
sub runRationalManualTester {
my ($script_name) = @_;
logger("\nRun the Rational manual tester");
chdir($manualTesterPath);
system( $rmt_binary. " -x " . "\"" . $script_name . "\"" . " -" );
}

Местный гуру посоветовал не юзать модули , если ты сам не гуру :)
В итого переписал , чтобы использовать репорт как обычный скрипт со входными параметрами
А вот и код generateBuildReport.pl

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

#create an array of build hash objects.Every build object contains hash with testcases were executed on this build
sub getTestCasesByBuild {
#list of tests which are executed on every build
my @tests = @{ getTestCasesList(@configuration) };
#list of available builds
my @builds = @{ getAutomatedBuilds() };
foreach my $build (@builds) {
logger( "Create testcases list for the build " . $build->{'name'}, true );
#list of testcases which were executed or not executed on this build
my @testcasesList;

foreach my $test (@tests) {
my $verdictRec = getLatestVerdict( $test->{'id'},
$Iteration, $build->{'id'} );
my %tc = %$test;
#$test->{'result'} = $verdictRec->{'result'};
#$test->{'resultId'} = $verdictRec->{'dbid'};
$tc{'result'} = $verdictRec->{'result'};
$tc{'resultId'} = $verdictRec->{'dbid'};
push (@testcasesList, \%tc);
#push (@testcasesList, \%test);
}
push (@{$build->{'tests'}}, @testcasesList);
}
return \@builds;
}
Опять же , весь код доступен тут :generateBuildReport.pl