From 84efabd8862fc59f26867f5ee04874291d89ff98 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 5 Feb 2019 10:36:08 +0100 Subject: [PATCH] Jenkinsfile: prepend environment name to tests results classname --- Jenkinsfile | 3 +- merge-junit-results.py | 65 ++++++++++++++++++++++++++++++++++++++++++ tox.ini | 2 +- 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100755 merge-junit-results.py diff --git a/Jenkinsfile b/Jenkinsfile index ccb6310..9c5a3d4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,7 +22,8 @@ pip install tox""" utils.publish_coverage_native('index.html') utils.publish_pylint('pylint.out') } - junit 'junit*.xml' + sh './merge-junit-results.py junit-*.xml >junit.xml' + junit 'junit.xml' } } } diff --git a/merge-junit-results.py b/merge-junit-results.py new file mode 100755 index 0000000..a50bc7f --- /dev/null +++ b/merge-junit-results.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# Corey Goldberg, Dec 2012 +# + +import os +import sys +import xml.etree.ElementTree as ET + + +"""Merge multiple JUnit XML files into a single results file. +Output dumps to sdtdout. +example usage: + $ python merge_junit_results.py results1.xml results2.xml > results.xml +""" + + +def main(): + args = sys.argv[1:] + if not args: + usage() + sys.exit(2) + if '-h' in args or '--help' in args: + usage() + sys.exit(2) + merge_results(args[:]) + + +def merge_results(xml_files): + failures = 0 + tests = 0 + errors = 0 + time = 0.0 + cases = [] + + for file_name in xml_files: + tree = ET.parse(file_name) + test_suite = tree.getroot() + failures += int(test_suite.attrib['failures']) + tests += int(test_suite.attrib['tests']) + errors += int(test_suite.attrib['errors']) + time += float(test_suite.attrib['time']) + name = test_suite.attrib.get('name', '') + for child in test_suite.getchildren(): + child.attrib['classname'] = '%s-%s' % (name, child.attrib.get('classname', '')) + cases.append(test_suite.getchildren()) + + new_root = ET.Element('testsuite') + new_root.attrib['failures'] = '%s' % failures + new_root.attrib['tests'] = '%s' % tests + new_root.attrib['errors'] = '%s' % errors + new_root.attrib['time'] = '%s' % time + for case in cases: + new_root.extend(case) + new_tree = ET.ElementTree(new_root) + ET.dump(new_tree) + + +def usage(): + this_file = os.path.basename(__file__) + print('Usage: %s results1.xml results2.xml' % this_file) + + +if __name__ == '__main__': + main() diff --git a/tox.ini b/tox.ini index 99eefe4..acbe14c 100644 --- a/tox.ini +++ b/tox.ini @@ -30,7 +30,7 @@ deps = pytest-django pytest-cov commands = - py.test {env:COVERAGE:} --junit-xml=junit-{envname}.xml {posargs:tests} + py.test {env:COVERAGE:} -o junit_suite_name={envname} --junit-xml=junit-{envname}.xml {posargs:tests} [testenv:pylint] deps =