Edgewall Software

source: trunk/bitten/report/testing.py @ 1001

Last change on this file since 1001 was 910, checked in by osimons, 13 years ago

Updated copyright to 2010.

  • Property svn:eol-style set to native
File size: 7.2 KB
CovLine 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2005-2007 Christopher Lenz <cmlenz@gmx.de>
4# Copyright (C) 2007-2010 Edgewall Software
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution. The terms
9# are also available at http://bitten.edgewall.org/wiki/License.
10
111from trac.core import *
112from trac.web.chrome import add_script
113from bitten.api import IReportChartGenerator, IReportSummarizer
14
115__docformat__ = 'restructuredtext en'
16
17
218class TestResultsChartGenerator(Component):
119    implements(IReportChartGenerator)
20
21    # IReportChartGenerator methods
22
123    def get_supported_categories(self):
124        return ['test']
25
126    def generate_chart_data(self, req, config, category):
327        assert category == 'test'
28
329        db = self.env.get_db_cnx()
330        cursor = db.cursor()
331        cursor.execute("""
332SELECT build.rev, build.platform, item_status.value AS status, COUNT(*) AS num
333FROM bitten_build AS build
334 LEFT OUTER JOIN bitten_report AS report ON (report.build=build.id)
335 LEFT OUTER JOIN bitten_report_item AS item_status
336  ON (item_status.report=report.id AND item_status.name='status')
337WHERE build.config=%s AND report.category='test'
338  AND build.rev_time >= %s AND build.rev_time <= %s
339GROUP BY build.rev_time, build.rev, build.platform, item_status.value
340ORDER BY build.rev_time, build.platform""", (config.name,
341                                             config.min_rev_time(self.env),
342                                             config.max_rev_time(self.env)))
43
344        prev_rev = None
345        prev_platform, platform_total = None, 0
346        tests = []
947        for rev, platform, status, num in cursor:
648            if rev != prev_rev:
249                tests.append([rev, 0, 0, 0])
250                prev_rev = rev
251                platform_total = 0
652            if platform != prev_platform:
353                prev_platform = platform
354                platform_total = 0
55
656            platform_total += num
657            tests[-1][1] = max(platform_total, tests[-1][1])
658            if status == 'success':
359                pass
360            elif status == 'ignore':
061                tests[-1][3] = max(num, tests[-1][3])
062            else:
363                tests[-1][2] = max(num, tests[-1][2])
64
365        data = {'title': 'Unit Tests',
366                'data': [
567                    {'label': 'Total', 'data': [[item[0], item[1]] for item in tests], 'lines': {'fill': True}},
568                    {'label': 'Failures', 'data': [[item[0], item[2]] for item in tests]},
569                    {'label': 'Ignored', 'data': [[item[0], item[3]] for item in tests]},
570                ],
371                'options': {
372                    'legend': {'position': 'sw', 'backgroundOpacity': 0.7},
373                    'xaxis': {'tickDecimals': 0},
374                    'yaxis': {'tickDecimals': 0},
375                },
376               }
77
378        return 'json.txt', {"json": data}
79
80
281class TestResultsSummarizer(Component):
182    implements(IReportSummarizer)
83
84    # IReportSummarizer methods
85
186    def get_supported_categories(self):
187        return ['test']
88
189    def render_summary(self, req, config, build, step, category):
190        assert category == 'test'
91
192        db = self.env.get_db_cnx()
193        cursor = db.cursor()
194        cursor.execute("""
195SELECT item_fixture.value AS fixture, item_file.value AS file,
196       COUNT(item_success.value) AS num_success,
197       COUNT(item_ignore.value) AS num_ignore,
198       COUNT(item_failure.value) AS num_failure,
199       COUNT(item_error.value) AS num_error
1100FROM bitten_report AS report
1101 LEFT OUTER JOIN bitten_report_item AS item_fixture
1102  ON (item_fixture.report=report.id AND item_fixture.name='fixture')
1103 LEFT OUTER JOIN bitten_report_item AS item_file
1104  ON (item_file.report=report.id AND item_file.item=item_fixture.item AND
1105      item_file.name='file')
1106 LEFT OUTER JOIN bitten_report_item AS item_success
1107  ON (item_success.report=report.id AND item_success.item=item_fixture.item AND
1108      item_success.name='status' AND item_success.value='success')
1109 LEFT OUTER JOIN bitten_report_item AS item_ignore
1110  ON (item_ignore.report=report.id AND item_ignore.item=item_fixture.item AND
1111      item_ignore.name='status' AND item_ignore.value='ignore')
1112 LEFT OUTER JOIN bitten_report_item AS item_failure
1113  ON (item_failure.report=report.id AND item_failure.item=item_fixture.item AND
1114      item_failure.name='status' AND item_failure.value='failure')
1115 LEFT OUTER JOIN bitten_report_item AS item_error
1116  ON (item_error.report=report.id AND item_error.item=item_fixture.item AND
1117      item_error.name='status' AND item_error.value='error')
1118WHERE category='test' AND build=%s AND step=%s
1119GROUP BY file, fixture
1120ORDER BY fixture""", (build.id, step.name))
121
1122        fixtures = []
1123        total_success, total_ignore, total_failure, total_error = 0, 0, 0, 0
4124        for fixture, file, num_success, num_ignore, num_failure, num_error in cursor:
3125            fixtures.append({'name': fixture, 
3126                             'num_success': num_success,
3127                             'num_ignore': num_ignore,
3128                             'num_error': num_error,
3129                             'num_failure': num_failure})
3130            total_success += num_success
3131            total_ignore += num_ignore
3132            total_failure += num_failure
3133            total_error += num_error
3134            if file:
3135                fixtures[-1]['href'] = req.href.browser(config.path, file)
136
137        # For each fixture, get a list of tests that don't succeed
4138        for fixture in fixtures:
3139            cursor.execute("""
3140SELECT item_status.value AS status, item_name.value AS name,
3141       item_traceback.value AS traceback
3142FROM bitten_report
3143 LEFT OUTER JOIN bitten_report_item AS item_fixture
3144  ON (item_fixture.report=bitten_report.id AND
3145      item_fixture.name='fixture')
3146 LEFT OUTER JOIN bitten_report_item AS item_status
3147  ON (item_status.report=bitten_report.id AND
3148      item_status.item=item_fixture.item AND
3149      item_status.name='status')
3150 LEFT OUTER JOIN bitten_report_item AS item_name
3151  ON (item_name.report=bitten_report.id AND
3152      item_name.item=item_fixture.item AND
3153      item_name.name='name')
3154 LEFT OUTER JOIN bitten_report_item AS item_traceback
3155  ON (item_traceback.report=bitten_report.id AND
3156      item_traceback.item=item_fixture.item AND
3157      item_traceback.name='traceback')
3158WHERE category='test' AND build=%s AND step=%s AND item_status.value<>'success' AND
3159      item_fixture.value=%s""", (build.id, step.name, fixture['name']))
160
3161            failures = []
5162            for status, name, traceback in cursor:
163                # use the fixture name if a name isn't supplied for the
164                # individual test
2165                if not name:
0166                    name = fixture['name']
2167                failures.append({'status': status,
2168                                 'name': name,
2169                                 'traceback': traceback})
3170            if failures:
2171                fixture['failures'] = failures
172
1173        data = {'fixtures': fixtures,
1174                'totals': {'success': total_success, 
1175                           'ignore': total_ignore,
1176                           'failure': total_failure,
1177                           'error': total_error}
1178               }
1179        return 'bitten_summary_tests.html', data
Note: See TracBrowser for help on using the repository browser.