Skip to main content

Manipulates JUnit/xUnit Result XML files

Project description

https://travis-ci.org/gastlygem/junitparser.svg?branch=master https://coveralls.io/repos/github/gastlygem/junitparser/badge.svg?branch=master

What does it do?

junitparser is a JUnit/xUnit Result XML Parser. Use it to parse and manipulate existing Result XML files, or create new JUnit/xUnit result XMLs from scratch.

There are already a lot of modules that converts JUnit/xUnit XML from a specific format, but you may run into some proprietory or less-known formats and you want to convert them and feed the result to another tool, or, you may want to manipulate the results in your own way. This is where junitparser come into handy.

Why junitparser?

  • Functionality. There are various JUnit/xUnit XML libraries, some does parsing, some does XML generation, some does manipulation. This module tries to do most functions in a single package.

  • Extensibility. JUnit/xUnit is hardly a standardized format. The base format is somewhat universally agreed with, but beyond that, there could be “custom” elements and attributes. junitparser aims to support them all, by monkeypatching and subclassing some base classes.

  • Pythonic. You can manipulate test cases and suites in a pythonic way.

Installation

pip install junitparser

Usage

Create Junit XML format reports from scratch

You have some test result data, and you want to convert them into junit.xml format.

from junitparser import TestCase, TestSuite, JUnitXml, Skipped, Error

# Create cases
case1 = TestCase('case1')
case1.result = Skipped()
case2 = TestCase('case2')
case2.result = Error('Example error message', 'the_error_type')

# Create suite and add cases
suite = TestSuite('suite1')
suite.add_property('build', '55')
suite.add_testcase(case1)
suite.add_testcase(case2)
      suite.delete_testcase(case2)

# Add suite to JunitXml
xml = JunitXml()
xml.add_testsuite(suite)
xml.write('junit.xml')

Read and manipulate exiting JUnit/xUnit XML files

You have some existing junit.xml files, and you want to modify the content.

from junitparser import JUnitXml

xml = JUnitXml.fromfile('/path/to/junit.xml')
for suite in xml:
    # handle suites
    for case in suite:
        # handle cases
xml.write() # Writes back to file

Merge XML files

You have two or more XML files, and you want to merge them into one.

from junitparser import JUnitXml

xml1 = JUnitXml.fromfile('/path/to/junit1.xml')
xml2 = JUnitXml.fromfile('/path/to/junit2.xml')

newxml = xml1 + xml2
# Alternatively, merge in place
xml1 += xml2

Note that it won’t check for duplicate entries. You need to deal with them on your own.

Create XML with custom attributes

You want to use an attribute that is not supported by default.

from junitparser import TestCase, Attr, IntAttr, FloatAttr

# Add the custom attribute
TestCase.id = IntAttr('id')
TestCase.rate = FloatAttr('rate')
TestCase.custom = Attr('custom')
case = TestCase()
case.id = 123
case.rate = 0.95
case.custom = 'foobar'

Handling XML with custom element

There may be once in 1000 years you want to it this way, but anyways. Suppose you want to add element CustomElement to TestCase.

from junitparser import Element, Attr, TestSuite

# Create the new element by subclassing Element,
# and add custom attributes to it.
class CustomElement(Element):
    _tag = 'custom'
    foo = Attr()
    bar = Attr()

testcase = TestCase()
custom = CustomElement()
testcase.append(custom)
# To find a single sub-element:
testcase.child(CustomElement)
# To iterate over custom elements:
for custom in testcase.iterchildren(CustomElement):
    ... # Do things with custom element

Handling custom XML attributes

Say you have some data stored in the XML as custom attributes and you want to read them out:

from junitparser import Element, Attr, TestSuite

# Create the new element by subclassing Element or one of its child class,
# and add custom attributes to it.
class MyTestCase(TestCase):
    foo = Attr()

xml = JUnitXml.fromfile('/path/to/junit.xml')
for suite in xml:
    # handle suites
    for case in suite:
        my_case = MyTestCase.fromelem(case)
        print(my_case.foo)

Command Line

$ junitparser --help
usage: junitparser [-h] [-v] {merge} ...

Junitparser CLI helper.

positional arguments:
{merge}        command
  merge        Merge Junit XML format reports with junitparser.

optional arguments:
-h, --help     show this help message and exit
-v, --version  show program's version number and exit
$ junitparser merge --help
usage: junitparser merge [-h] paths [paths ...] output

positional arguments:
paths       Original XML path(s).
output      Merged XML Path.

optional arguments:
-h, --help  show this help message and exit

Test

You can run the cases directly:

python test.py

Or use pytest:

pytest test.py

Notes

There are some other packages providing similar functionalities. They are out there for a longer time, but might not be as fun as junitparser:

  • xunitparser: Read JUnit/XUnit XML files and map them to Python objects

  • xunitgen: Generate xUnit.xml files

  • xunitmerge: Utility for merging multiple XUnit xml reports into a single xml report.

  • junit-xml: Creates JUnit XML test result documents that can be read by tools such as Jenkins

Contribute

Please do!

Changelog

1.2.0

  • Added support for reading custom attributes and elements. Thanks to @arewm

1.1.0

  • Added a command to merge xml files. Thanks to @imsuwj

1.0.0

  • Python 2 support. Thanks to @SteinHeselmans

0.9.0

  • Supports xmls with testcase as root node.

  • First beta release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

junitparser-1.2.1.tar.gz (9.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

junitparser-1.2.1-py2.py3-none-any.whl (11.5 kB view details)

Uploaded Python 2Python 3

File details

Details for the file junitparser-1.2.1.tar.gz.

File metadata

  • Download URL: junitparser-1.2.1.tar.gz
  • Upload date:
  • Size: 9.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for junitparser-1.2.1.tar.gz
Algorithm Hash digest
SHA256 2138620438bf0c09704f038df07bfc78563974fcbfe5220d8a8d4f07ae212ace
MD5 f90bcc87a7e85897cf0e1a7671131992
BLAKE2b-256 719f50b4ba336e9c3750d471fc724c15e1ea1e760e1d4b5a5f95e044b9f95a8a

See more details on using hashes here.

File details

Details for the file junitparser-1.2.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for junitparser-1.2.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 b4f4a589422150dd6f6a2651bdd4470c91c653ce2f1fa0f51bd2327f1797cdbd
MD5 f7bb1ccfbb22ea4e1962c09495c20425
BLAKE2b-256 1bd76d7a437ce8d85df692ea7dea5075e36d91db2f961a6d5341cfea41f3f67e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page