← Back to team overview

maria-developers team mailing list archive

Re: 46c66698d63: MENT-566 jUnit xml fixes

 

Hi Serg,

Thanks for the review. I've addressed the review comments in commit 1cedc95
in branch 10.2-MENT-566. See below for comments.

On Mon, Mar 30, 2020 at 7:34 PM Sergei Golubchik <serg@xxxxxxxxxxx> wrote:

> Hi, Rasmus!
>
> Please, see below
>
> On Mar 30, Rasmus Johansson wrote:
> > revision-id: 46c66698d63 (mariadb-10.2.31-189-g46c66698d63)
> > parent(s): 065a3d3eed7
> > author: Rasmus Johansson <razze@xxxxxx>
> > committer: Rasmus Johansson <razze@xxxxxx>
> > timestamp: 2020-03-26 10:50:06 +0000
> > message:
> >
> > MENT-566 jUnit xml fixes
> >
> > diff --git a/mysql-test/lib/mtr_report.pm b/mysql-test/lib/mtr_report.pm
> > index 3701ad79b15..1c6825d8fb7 100644
> > --- a/mysql-test/lib/mtr_report.pm
> > +++ b/mysql-test/lib/mtr_report.pm
> > @@ -35,6 +37,7 @@ use My::Platform;
> >  use POSIX qw[ _exit ];
> >  use IO::Handle qw[ flush ];
> >  use mtr_results;
> > +use Cwd 'abs_path';
>
> this seems to be unused now
>

Removed


> >
> >  use Term::ANSIColor;
> >
> > @@ -60,6 +63,8 @@ our $verbose;
> >  our $verbose_restart= 0;
> >  our $timer= 1;
> >
> > +my $xml_report = "";
>
> this could be moved down inside if ($::opt_xml_report)
>

Done

>
> > +
> >  sub report_option {
> >    my ($opt, $value)= @_;
> >
> > @@ -402,6 +409,92 @@ sub mtr_report_stats ($$$$) {
> >      print "All $tot_tests tests were successful.\n\n";
> >    }
> >
> > +  if ($::opt_xml_report) {
> > +    my @sorted_tests = sort {$a->{'name'} cmp $b->{'name'}} @$tests;
> > +    my $last_suite = "";
> > +    my $current_suite = "";
> > +    my $timest = isotime(time);
> > +    my %suite_totals;
> > +    my %suite_time;
> > +    my %suite_tests;
> > +    my %suite_failed;
> > +    my %suite_disabled;
> > +    my %suite_skipped;
> > +    my $host = hostname;
> > +    my $suiteNo = 0;
> > +
> > +    # loop through test results to count totals
> > +    foreach my $test ( @sorted_tests ) {
> > +      $current_suite = $test->{'suite'}->{'name'};
> > +
> > +      if ($test->{'timer'} eq "") {
> > +        $test->{'timer'} = 0;
> > +      }
> > +
> > +      # $suite_totals{$current_suite . "_time"} =
> $suite_totals{$current_suite . "_time"} + $test->{'timer'};
> > +      # $suite_totals{$current_suite . "_tests"} =
> $suite_totals{$current_suite . "_tests"} + 1;
>
> don't forget to remove all these commented-out lines before pushing
>

Removed in a couple of places.


> > +      $suite_time{$current_suite} = $suite_time{$current_suite} +
> $test->{'timer'};
> > +      $suite_tests{$current_suite} = $suite_tests{$current_suite} + 1;
> > +
> > +      if ($test->{'result'} eq "MTR_RES_FAILED") {
> > +        # $suite_totals{$current_suite . "_failed"} =
> $suite_totals{$current_suite . "_failed"} + 1;
> > +        $suite_failed{$current_suite} = $suite_failed{$current_suite} +
> 1;
> > +      } elsif ($test->{'result'} eq "MTR_RES_SKIPPED" &&
> $test->{'disable'}) {
> > +        # $suite_totals{$current_suite . "_disabled"} =
> $suite_totals{$current_suite . "_disabled"} + 1;
> > +        $suite_disabled{$current_suite} =
> $suite_disabled{$current_suite} + 1;
> > +      } elsif ($test->{'result'} eq "MTR_RES_SKIPPED") {
> > +        $suite_skipped{$current_suite} = $suite_skipped{$current_suite}
> + 1;
> > +      }
> > +
> > +      $suite_totals{"all_time"} = $suite_totals{"all_time"} +
> $test->{'timer'};
> > +    }
> > +
> > +    # generate xml
> > +    $xml_report = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
> > +    $xml_report = $xml_report . "<testsuites disabled=\"" .
> $tot_disabled . "\" errors=\"\" failures=\"" . $tot_failed . "\" name=\"\"
> tests=\"" . $tot_tests . "\" time=\"" . $suite_totals{"all_time"} . "\">\n";
>
> I find it more concise to write
>
>     $xml_report .= "<testsuites ..."
>

Changed to use that syntax.


> instead of
>
>     $xml_report = $xml_report . "<testsuites ..."
>
> and also it's easier to read, because the first form directly means
> "append to the variable", while the second means "concatenate two strings
> and store the result" and by using the target variable also as first string
> one gets the append effect.
>
> > +
> > +    foreach my $test ( @sorted_tests ) {
> > +      $current_suite = $test->{'suite'}->{'name'};
> > +
> > +      if ($current_suite ne $last_suite) {
> > +        if ($last_suite ne "") {
> > +          $xml_report = $xml_report . "\t</testsuite>\n";
> > +          $suiteNo++;
> > +        }
> > +
> > +        $xml_report = $xml_report . "\t<testsuite disabled=\"" .
> $suite_disabled{$current_suite} . "\" errors=\"\" failures=\"" .
> $suite_failed{$current_suite} . "\" hostname=\"" . $host . "\" id=\"" .
> $suiteNo . "\" name=\"" . $current_suite . "\" package=\"\" skipped=\"" .
> $suite_skipped{$current_suite} . "\" tests=\"" .
> $suite_tests{$current_suite} . "\" time=\"" . $suite_time{$current_suite} .
> "\" timestamp=\"" . $timest . "\">\n";
>
> why do you always avoid variable interapolation? The above line could've
> been written as
>
>        $xml_report .= qq(\t<testsuite
> disabled="$suite_disabled{$current_suite}" errors=""
> failures="$suite_failed{$current_suite}" hostname="$host" id="$suiteNo"
> name="$current_suite" package="" skipped="$suite_skipped{$current_suite}"
> tests="$suite_tests{$current_suite}" time="$suite_time{$current_suite}"
> timestamp="$timest">\n);
>
> which is notably shorter and more readable
>

Switched to using qq(...);


> > +        $last_suite = $current_suite;
> > +      }
> > +
> > +      $xml_report = $xml_report . "\t\t<testcase assertions=\"\"
> classname=\"" . $current_suite . "\" name=\"$test->{'name'}\"
> status=\"$test->{'result'}\" time=\"" . $test->{timer} . "\"";
> > +
> > +      if ($test->{'result'} eq "MTR_RES_FAILED") {
> > +        $xml_report = $xml_report . ">\n\t\t\t<failure message=\"\"
> type=\"" . $test->{'result'} . "\">\n<![CDATA[" . $test->{'logfile'} .
> "]]>\n\t\t\t</failure>\n\t\t</testcase>\n";
> > +      } elsif ($test->{'result'} eq "MTR_RES_SKIPPED" &&
> $test->{'disable'}) {
> > +        $xml_report = $xml_report . ">\n\t\t\t<failure
> message=\"disabled\" type=\"" . $test->{'result'} .
> "\"/>\n\t\t</testcase>\n";
> > +      } elsif ($test->{'result'} eq "MTR_RES_SKIPPED") {
> > +        $xml_report = $xml_report . ">\n\t\t\t<failure
> message=\"skipped\" type=\"" . $test->{'result'} .
> "\"/>\n\t\t</testcase>\n";
> > +      } else {
> > +        $xml_report = $xml_report . " />\n";
> > +      }
> > +
> > +      # check if last test
> > +      if ($test eq @sorted_tests[$#sorted_tests]) {
> > +        $xml_report = $xml_report . "\t</testsuite>\n";
> > +      }
>
> better to print this after the loop, then to do a check for every test.
>
> it will not be wrong, because your condition
>
>    $test eq @sorted_tests[$#sorted_tests]
>
> can only be true once, for the very last test. So you can as well remove
> the whole if()
> and put the unconditional
>
>     $xml_report .= "\t</testsuite>\n";
>
> after the loop.
>

See next comment.

>
> > +    }
> > +
> > +    $xml_report = $xml_report . "</testsuites>\n";
>
> or just combine it with this one:
>
>     $xml_report .= "\t</testsuite>\n</testsuites>\n";
>

Done this way.


> > +
> > +    # save to file
> > +    # my $xml_file = $::opt_vardir . "/log/" . $::opt_xml_report;
> > +    my $xml_file = $::opt_xml_report;
> > +
> > +    open XML_FILE, ">" . $xml_file;
>
> error checking? Even if it's just
>
>    open XML_FILE, ">" , $xml_file or die "$!";
>
> and always use the 3-form open(). Where ">" is a separate argument, not
> concatenated to the file name (see how I wrote it above)
>

added die and changed to 3-form open


> > +    print XML_FILE $xml_report;
> > +    close XML_FILE;
> > +  }
> > +
> >    if (@$extra_warnings)
> >    {
> >      print <<MSG;
> > diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
> > index ef37cb4144d..298ba0015a3 100755
> > --- a/mysql-test/mysql-test-run.pl
> > +++ b/mysql-test/mysql-test-run.pl
> > @@ -80,6 +80,7 @@ use lib "lib";
> >
> >  use Cwd ;
> >  use Cwd 'realpath';
> > +use Cwd 'abs_path';
>
> this seems to be unused now
>

Removed


> >  use Getopt::Long;
> >  use My::File::Path; # Patched version of File::Path
> >  use File::Basename;
>

BR,
Rasmus

Follow ups

References