Merge lp:~pwlars/checkbox/junit-exporter into lp:checkbox

Proposed by Paul Larson
Status: Merged
Approved by: Paul Larson
Approved revision: 4451
Merged at revision: 4454
Proposed branch: lp:~pwlars/checkbox/junit-exporter
Merge into: lp:checkbox
Diff against target: 71 lines (+37/-0)
4 files modified
checkbox-ng/launchers/checkbox-cli (+1/-0)
plainbox/plainbox/impl/providers/exporters/data/junit.xml (+28/-0)
plainbox/plainbox/impl/providers/exporters/units/exporter.pxu (+7/-0)
plainbox/plainbox/impl/session/manager.py (+1/-0)
To merge this branch: bzr merge lp:~pwlars/checkbox/junit-exporter
Reviewer Review Type Date Requested Status
Maciej Kisielewski Approve
Review via email: mp+301098@code.launchpad.net

Description of the change

This adds an exporter for junit xml. I find this particularly useful for working with jenkins, which has some native support for taking the output in junit and producing nice graphs and trends for test case pass/fail rates.

To post a comment you must log in.
Revision history for this message
Maciej Kisielewski (kissiel) wrote :

+1.

Tested with a few scenarios, including non-matching plainbox run -i.
Everything worked beautifully.

I'm wondering if we can template name="" with something (see inline)

review: Approve
Revision history for this message
Paul Larson (pwlars) wrote :

I thought about that, but couldn't see where to get some definitive name that would work for all cases. Maybe just "checkbox" but that's just as generic as nothing at all. I looked back at some older jenkins runs that pulled results from autopilot and it had nothing in that field also. It seems to be optional and jenkins certainly doesn't care, but we can easily fill it in later if we want.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'checkbox-ng/launchers/checkbox-cli'
2--- checkbox-ng/launchers/checkbox-cli 2016-07-21 17:41:44 +0000
3+++ checkbox-ng/launchers/checkbox-cli 2016-07-25 17:58:00 +0000
4@@ -693,6 +693,7 @@
5 if not os.path.exists(self.base_dir):
6 os.makedirs(self.base_dir)
7 for exporter, file_ext in [('hexr', '.xml'), ('html', '.html'),
8+ ('junit', '.junit.xml'),
9 ('xlsx', '.xlsx'), ('tar', '.tar.xz')]:
10 path = os.path.join(self.base_dir, ''.join(
11 ['submission_', timestamp, file_ext]))
12
13=== added file 'plainbox/plainbox/impl/providers/exporters/data/junit.xml'
14--- plainbox/plainbox/impl/providers/exporters/data/junit.xml 1970-01-01 00:00:00 +0000
15+++ plainbox/plainbox/impl/providers/exporters/data/junit.xml 2016-07-25 17:58:00 +0000
16@@ -0,0 +1,28 @@
17+{%- set state = manager.default_device_context.state -%}
18+{%- set job_state_map = state.job_state_map -%}
19+{%- set passes = manager.state.get_outcome_stats()["pass"] -%}
20+{%- set fails = manager.state.get_outcome_stats()["fail"] -%}
21+{%- set skips = manager.state.get_outcome_stats()["skip"] +
22+ manager.state.get_outcome_stats()["not-supported"] -%}
23+{%- set errors = manager.state.get_outcome_stats()["crash"] -%}
24+<?xml version="1.0" encoding="UTF-8"?>
25+ <testsuites failures="{{ fails }}" name="" tests="{{ passes }}" skipped="{{ skips }}" errors="{{ errors }}">
26+ {%- for job_id in job_state_map|sort %}
27+ {%- set job_state = job_state_map[job_id] %}
28+ {%- if job_state.job.plugin not in ("resource", "local", "attachment") and job_state.result.outcome %}
29+ <testcase classname="{{ job_state.job.id }}" name="{{ job_state.job.id }}" time="{{ job_state.result.execution_duration }}">
30+ {%- if job_state.result.outcome == 'skip' or job_state.result.outcome == 'not-supported' -%}
31+ <skipped />
32+ {%- elif job_state.result.outcome == 'fail' -%}
33+ <failure type="">
34+ {{ job_state.result.io_log_as_flat_text }}
35+ </failure>
36+ {%- elif job_state.result.outcome == 'crash' -%}
37+ <error type="">
38+ {{ job_state.result.io_log_as_flat_text }}
39+ </error>
40+ {%- endif %}
41+ </testcase>
42+ {%- endif -%}
43+ {%- endfor %}
44+ </testsuites>
45
46=== modified file 'plainbox/plainbox/impl/providers/exporters/units/exporter.pxu'
47--- plainbox/plainbox/impl/providers/exporters/units/exporter.pxu 2016-07-01 09:08:55 +0000
48+++ plainbox/plainbox/impl/providers/exporters/units/exporter.pxu 2016-07-25 17:58:00 +0000
49@@ -50,3 +50,10 @@
50 entry_point: jinja2
51 file_extension: txt
52 data: {"template": "global.txt"}
53+
54+unit: exporter
55+id: junit
56+_summary: Generate junit XML
57+entry_point: jinja2
58+file_extension: junit.xml
59+data: {"template": "junit.xml"}
60
61=== modified file 'plainbox/plainbox/impl/session/manager.py'
62--- plainbox/plainbox/impl/session/manager.py 2016-07-04 09:51:32 +0000
63+++ plainbox/plainbox/impl/session/manager.py 2016-07-25 17:58:00 +0000
64@@ -480,6 +480,7 @@
65 '2013.com.canonical.plainbox::hexr': 'xml',
66 '2013.com.canonical.plainbox::html': 'html',
67 '2013.com.canonical.plainbox::json': 'json',
68+ '2013.com.canonical.plainbox::junit': 'junit',
69 '2013.com.canonical.plainbox::rfc822': 'rfc822',
70 '2013.com.canonical.plainbox::tar': 'tar',
71 '2013.com.canonical.plainbox::text': 'text',

Subscribers

People subscribed via source and target branches