ソースを参照

Fix #123: Add --merged output to testrail-results

George S. Baugh 8 年 前
コミット
391cb9d000
4 ファイル変更47 行追加9 行削除
  1. 1 0
      Changes
  2. 38 8
      bin/testrail-results
  3. 0 0
      t/data/faketest_cache.json
  4. 8 1
      t/testrail-results.t

+ 1 - 0
Changes

@@ -8,6 +8,7 @@ Revision history for Perl module TestRail::API
     - Fix warnings when testrail-results encounters 'assigned' results
     - make --cachefile a multi argument in testrail-results
     - add the --perfile argument to testrail-results
+    - add the --merged argument to testrail-results
 
 0.038 2017-01-23 TEODESIAN
     - Optimize TestRail::Utils::Find::getResults and testrail-results

+ 38 - 8
bin/testrail-results

@@ -73,6 +73,8 @@ All mandatory options not passed with the above switches, or in your ~/.testrail
 
 --json       : Print results as a JSON serialization.
 
+-m --merged : In merge the output with the cached data provided (if any).
+
 --perfile : Output JSON summary data per file to the provided directory when in json mode
 
 =back
@@ -141,6 +143,7 @@ sub run {
         'f|fast'          => \$opts->{'fast'},
         'json'            => \$opts->{'json'},
         'perfile=s'       => \$opts->{'perfile'},
+        'm|merged'        => \$opts->{'merged'},
         'h|help'          => \$opts->{'help'},
     );
 
@@ -156,6 +159,7 @@ sub run {
     my $prior_search;
     my $prior_runs = [];
     my $prior_plans = [];
+    my $prior_hash = {};
     if ($opts->{'cachefile'}) {
         foreach my $cf (@{$opts->{cachefile}}) {
             die("Prior search file '$cf' passed does not exist") if $cf && !( -e $cf);
@@ -167,6 +171,13 @@ sub run {
             close($fh);
             $prior_search = JSON::MaybeXS::decode_json($raw_text);
             foreach my $key (keys(%$prior_search)) {
+                my $str_str = $prior_search->{search_string} // '';
+                my $str_pat = $opts->{pattern} // '';
+                if ( $str_str ne $str_pat) {
+                    print "Cached data in $cf has search pattern mismatch, skipping...\n";
+                    next;
+                }
+                $prior_hash->{$key} = $prior_search->{$key} if $opts->{merged};
                 push(@$prior_runs, @{$prior_search->{$key}->{'seen_runs'}});
                 push(@$prior_plans,@{$prior_search->{$key}->{'seen_plans'}});
             }
@@ -186,7 +197,10 @@ sub run {
     my %status_map;
     @status_map{map {$_->{'id'}} @$statuses} = map {$_->{'label'}} @$statuses;
 
-    my ($out,$out_json) = ('',{});
+    my $out = '';
+    my $out_json = $prior_hash;
+
+
     foreach my $case (keys(%$res)) {
         $out .= "#############################\n";
         my $num_runs = 0;
@@ -197,6 +211,7 @@ sub run {
         my $avg_elapsed = 0;
         my $median_runtime = 0;
         my $elapsetotals = [];
+        $out_json->{$case} //= {};
 
         foreach my $casedef (@{$res->{$case}}) {
             $num_runs++;
@@ -216,6 +231,18 @@ sub run {
         @$defects   = uniq(@$defects);
         foreach my $st (keys(%$versions_by_status)) {
             @{$versions_by_status->{$st}} = uniq(@{$versions_by_status->{$st}});
+            $out_json->{$case}->{versions_by_status}->{$st} //= [];
+        }
+
+
+        #Initialize out_json correctly
+        $out_json->{$case}->{num_runs}     //= 0;
+        $out_json->{$case}->{seen_runs}    //= [];
+        $out_json->{$case}->{seen_plans}   //= [];
+        $out_json->{$case}->{elapsetotals} //= [];
+        $out_json->{$case}->{defects}      //= [];
+        foreach my $status (keys(%status_map)) {
+            $out_json->{$case}->{$status_map{$status}} //= 0;
         }
 
         my $pattern_output = '';
@@ -223,13 +250,14 @@ sub run {
         $pattern_output = " using search string '$opts->{pattern}'" if $opts->{'pattern'};
 
         $out .= "$case was present in $num_runs runs$pattern_output.\n";
-        $out_json->{$case}->{'num_runs'}   = $num_runs;
-        $out_json->{$case}->{'seen_runs'}  = $seen_runs;
-        $out_json->{$case}->{'seen_plans'} = $seen_plans;
+        $out_json->{$case}->{'num_runs'}   += $num_runs;
+        push(@{$out_json->{$case}->{'seen_runs'}}, @$seen_runs);
+        push(@{$out_json->{$case}->{'seen_plans'}}, @$seen_plans);
 
         #Collect time statistics
+        push(@{$out_json->{$case}->{elapsetotals}},@$elapsetotals);
         my $timestats = Statistics::Descriptive::Full->new();
-        $timestats->add_data(@$elapsetotals);
+        $timestats->add_data(@{$out_json->{$case}->{elapsetotals}});
 
         $out_json->{$case}->{total_elapsed}   = $timestats->sum() || 0;
         $out .= "Total time spent running this test: $out_json->{$case}->{total_elapsed} seconds\n";
@@ -248,16 +276,18 @@ sub run {
 
         foreach my $status (keys(%$casetotals)) {
             $out .= "$status_map{$status}: $casetotals->{$status}\n";
-            $out_json->{$case}->{$status_map{$status}} = $casetotals->{$status};
+            $out_json->{$case}->{$status_map{$status}} += $casetotals->{$status};
         }
 
         foreach my $status (keys(%$versions_by_status)) {
             $out .= "Versions $status_map{$status} in:\n".join(',',@{$versions_by_status->{$status}})."\n";
+            push(@{$out_json->{$case}->{versions_by_status}->{$status}}, @{$versions_by_status->{$status}});
+            @{$out_json->{$case}->{versions_by_status}->{$status}} = uniq(@{$out_json->{$case}->{versions_by_status}->{$status}});
         }
-        $out_json->{$case}->{versions_by_status} = $versions_by_status;
 
         $out .= "\nDefects related to case:\n".join(',',@$defects)."\n" if @$defects;
-        $out_json->{$case}->{defects} = $defects;
+        push(@{$out_json->{$case}->{defects}}, @$defects);
+        @{$out_json->{$case}->{defects}} = uniq(@{$out_json->{$case}->{defects}});
 
     }
 

ファイルの差分が大きいため隠しています
+ 0 - 0
t/data/faketest_cache.json


+ 8 - 1
t/testrail-results.t

@@ -9,7 +9,7 @@ require 'testrail-results';
 use lib $FindBin::Bin.'/lib';
 use Test::LWP::UserAgent::TestRailMock;
 
-use Test::More 'tests' => 31;
+use Test::More 'tests' => 33;
 use Capture::Tiny qw{capture_merged};
 use List::MoreUtils qw{uniq};
 use Test::Fatal;
@@ -108,6 +108,13 @@ is($code, 0, "Exit code OK looking for results of fake.test in json mode");
 chomp $out;
 is($out,"{}","Caching mode works");
 
+#Check merged mode
+@args = qw{--apiurl http://testrail.local --user test@fake.fake --password fake --json --merged --cachefile t/data/faketest_cache.json t/fake.test };
+($out,$code) = TestRail::Bin::Results::run('browser' => $Test::LWP::UserAgent::TestRailMock::mockObject, 'args' => \@args);
+is($code, 0, "Exit code OK looking for results of fake.test in json mode");
+chomp $out;
+like($out,qr/fake.test/,"Caching mode includes prior data in output with --merged mode");
+
 #check pertest mode
 @args = qw{--apiurl http://testrail.local --user test@fake.fake --password fake --json --perfile bogus.dir t/fake.test };
 like( exception { TestRail::Bin::Results::run('browser' => $Test::LWP::UserAgent::TestRailMock::mockObject, 'args' => \@args) }, qr/no such dir/i, "Bad pertest dir throws");

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません