[dts] [PATCH] framework: Adding JSON reporter

Radoslaw Biernacki radoslaw.biernacki at linaro.org
Wed Sep 6 15:28:00 CEST 2017


This was initially for our needs.
For general usage it need to be changed so full result will be reported.
I will fix that.

On 6 September 2017 at 04:25, Jianbo Liu <jianbo.liu at linaro.org> wrote:

> On 5 September 2017 at 23:26, Radoslaw Biernacki
> <radoslaw.biernacki at linaro.org> wrote:
> > This patch adds the JSON reporter class which puts the results
> > into output/test_results.json file
> > Having JSON file format for results is usefull for CI integration.
> >
> > Signed-off-by: Radoslaw Biernacki <radoslaw.biernacki at linaro.org>
> > ---
> >  framework/dts.py           |  5 ++++
> >  framework/json_reporter.py | 75 ++++++++++++++++++++++++++++++
> ++++++++++++++++
> >  2 files changed, 80 insertions(+)
> >  create mode 100644 framework/json_reporter.py
> >
> > diff --git a/framework/dts.py b/framework/dts.py
> > index 931bf38..b38deb7 100644
> > --- a/framework/dts.py
> > +++ b/framework/dts.py
> > @@ -51,6 +51,7 @@ from test_case import TestCase
> >  from test_result import Result
> >  from stats_reporter import StatsReporter
> >  from excel_reporter import ExcelReporter
> > +from json_reporter import JSONReporter
> >  from exception import TimeoutException, ConfigParseException,
> VerifyFailure
> >  from logger import getLogger
> >  import logger
> > @@ -66,6 +67,7 @@ sys.setdefaultencoding('UTF8')
> >  requested_tests = None
> >  result = None
> >  excel_report = None
> > +json_report = None
> >  stats_report = None
> >  log_handler = None
> >
> > @@ -443,6 +445,7 @@ def run_all(config_file, pkgName, git, patch,
> skip_setup,
> >      global requested_tests
> >      global result
> >      global excel_report
> > +    global json_report
> >      global stats_report
> >      global log_handler
> >      global check_case_inst
> > @@ -506,6 +509,7 @@ def run_all(config_file, pkgName, git, patch,
> skip_setup,
> >
> >      # report objects
> >      excel_report = ExcelReporter(output_dir + '/test_results.xls')
> > +    json_report = JSONReporter(output_dir + '/test_results.json')
> >      stats_report = StatsReporter(output_dir + '/statistics.txt')
> >      result = Result()
> >
> > @@ -574,6 +578,7 @@ def save_all_results():
> >      Save all result to files.
> >      """
> >      excel_report.save(result)
> > +    json_report.save(result)
> >      stats_report.save(result)
> >
> >
> > diff --git a/framework/json_reporter.py b/framework/json_reporter.py
> > new file mode 100644
> > index 0000000..47e6869
> > --- /dev/null
> > +++ b/framework/json_reporter.py
> > @@ -0,0 +1,75 @@
> > +# BSD LICENSE
> > +#
> > +# Copyright(c) 2017 Linaro. All rights reserved.
> > +# All rights reserved.
> > +#
> > +# Redistribution and use in source and binary forms, with or without
> > +# modification, are permitted provided that the following conditions
> > +# are met:
> > +#
> > +#   * Redistributions of source code must retain the above copyright
> > +#     notice, this list of conditions and the following disclaimer.
> > +#   * Redistributions in binary form must reproduce the above copyright
> > +#     notice, this list of conditions and the following disclaimer in
> > +#     the documentation and/or other materials provided with the
> > +#     distribution.
> > +#   * Neither the name of Intel Corporation nor the names of its
> > +#     contributors may be used to endorse or promote products derived
> > +#     from this software without specific prior written permission.
> > +#
> > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> > +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> > +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> > +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> > +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> > +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> > +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> > +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> > +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> > +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> > +
> > +import json
> > +import os
> > +
> > +class JSONReporter(object):
> > +
> > +    def __init__(self, filename):
> > +        self.filename = filename
> > +
> > +    def __scan_cases(self, result, dut, target, suite):
> > +        case_results = {}
> > +        for case in result.all_test_cases(dut, target, suite):
> > +             test_result = result.result_for(dut, target, suite, case)
> > +             case_name = '{}/{}'.format(suite,case)
> > +             if 'PASSED' in test_result:
> > +                 case_results[case_name] = 'pass'
> > +             else:
> > +                 case_results[case_name] = 'fail'
>
> Is it reasonable to consider "N/A" or "SKIP" as fail?
>
> > +        return case_results
> > +
> > +    def __scan_target(self, result, dut, target):
> > +        if result.is_target_failed(dut, target):
> > +            return {'Target failed', 'fail'}
> > +        case_results = {}
> > +        for suite in result.all_test_suites(dut, target):
> > +            case_results.update(self.__scan_cases(result, dut, target,
> suite))
> > +        abspath = os.path.abspath(self.filename)
> > +        filename = os.path.basename(abspath)
> > +        dirname = os.path.dirname(abspath)
> > +        splitname = os.path.splitext(filename)
> > +        extfilename = '{}/{}_{}_{}{}'.format(dirname, splitname[0],
> dut, target, splitname[1])
> > +        with open(extfilename, 'w') as outfile:
> > +            json.dump(case_results, outfile, indent=4, separators=(',',
> ': '), encoding="utf-8", sort_keys=True)
> > +
> > +    def __scan_dut(self, result, dut):
> > +        if result.is_dut_failed(dut):
> > +            return {'DUT failed', 'fail'}
> > +        case_results = {}
> > +        for target in result.all_targets(dut):
> > +            self.__scan_target(result, dut, target)
> > +
> > +    def save(self, result):
> > +        case_results = {}
> > +        for dut in result.all_duts():
> > +            self.__scan_dut(result, dut)
> > --
> > 1.9.1
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://dpdk.org/ml/archives/dts/attachments/20170906/12e91ee5/attachment.html>


More information about the dts mailing list