2

テキスト ファイルから読み取り、JUnit 形式に基づいて XML に変換するスクリプトを作成しようとしています。次のようなテキスト ファイルが出力されます。

TEST                      TITLE                                    GROUP    PRIO R-STAT R-TIME       VERDICT  VERDICT-TEXT
------------------------- ---------------------------------------- -------- ---- ------ ------------ -------- --------------------------------------------------
Telex                     Telex type                               GROUP1   1    PASS   00:00:02.914 PASS     Over
Time                      Timer                                    GROUP2   1    PASS   00:00:06.619 PASS     Over

上記のテキスト ファイルに期待する出力は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<testsuites name="HostTests for Character" tests="TestSuite" time="">
<testsuite name="GROUP1" package="GROUP1" tests="" errors="">
<testcase classname="GROUP1.Telex" name="Telex type" time="" status="">
    <skipped/>
            <error message="" type=""/>
    <failure message="" type=""/>
    <system-out/>
            <system-err/>
        <testcase/>
<testcase classname="GROUP2.Time" name="Timer" time="" status="">
    <skipped/>
            <error message="" type=""/>
    <failure message="" type=""/>
    <system-out/>
            <system-err/>
<testcase/>
<textsuite/>
<testsuites/> 

Jenkinsでこれを実行するPerlスクリプトを作成するにはどうすればよいですか?

私も試しました:

#!/usr/bin/perl
use strict;
use warnings;

my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();
my $textroot = $xslt ->parse_verdict_file("\\\~/jenkins/workspace/HostTestOAM/trunk/nash/test/regression/logs/verdict.1.txt");

my $checker = 1;
my @txtfile = logj('logs/verdict*.txt');
foreach (@txtfile){
my $txtfile = $_;
$txtfile =~ s/([ ()])/\\$1/g;
$txtroot2 = "\\\~/jenkins/workspace/HostTestOAM/trunk/nash/test/regression/logs/$txtfile";

my $source = $parser->parse_file($txtroot2);
    my $results = $textroot->transform($source);

my $xmlparsed = "\\\~/jenkins/workspace/HostTestOAM/trunk/nash/test/regression/logs/results$checker.xml";

unless(open FILE, '>'.$xmlparsed) {
die "\Creating failed\n";
}

$textroot -> output_file($results, FILE);
close FILE;
$checker++;
}
4

2 に答える 2

0

今、私は別の方法を試しましたが、それは良いと思います。以下はコード行です。

#!/usr/bin/perl
use strict;
use warnings;
use XML::Writer;
use XML::Simple;

my $file = 'logs/verdict*.txt';

my %testsuite = (testcase => [
{classname => 'CELL.NbapCellDelete', name => 'Cell deletion', time => '%file',          status => '%file'},]
);
my $xmlObj = XML::Simple->new(RootName => 'testsuite');
print $xmlObj->XMLout (\%testsuite, noattr => 1, xmldecl => => '<?xml version="1.0"      encoding="UTF-8"?>');

問題は時間とステータスです。私の考えは、動的配列または動的ハッシュを作成して時間とステータスを保存し、それらをxmlファイルにプッシュして、その動的配列と変数の値を比較することです。助けていただけますか?

于 2013-05-14T08:44:44.210 に答える
0

あなたがしなければならないことは、XML をどのように見せたいかのテンプレートを作成し、変更される可能性のあるビットのプレースホルダーを配置することだと私には思えます。言う、

my $template = '<testsuite name="XXXGROUPXXX" package="XXXGROUPXXX" tests="" errors="">
<testcase classname="XXXGROUPXXX.XXXTESTXXX" name="XXXTITLEXXX" time="" status="">';

次に、表形式のデータのファイルを読み込む必要がありますが、これは Perl では簡単です: 通常のイディオムです。(時間を節約するために、ここでは文法的な Perl は書きません...)

open(IN, $file);
while ($line = <IN>)
{
  chomp($line);
  # skip noise, blanks: next if (blah)
  # Now split the line into fields so you can extract what you need
  ($test, $title, $group, $the_rest) = split($line); 

  # and substitute the values read for test, title, group into a template
  # rinse and repeat;
  ($foo = $template) =~ s/XXXGROUPXXX/$group);


  #print the new text out
  print $foo;
}
close(IN);
于 2013-05-11T23:35:22.120 に答える