CODESYS - the IEC 61131-3 automation software
https://forum.codesys.com/

Codesys Test Manager - Converting report xml to Junit format
https://forum.codesys.com/viewtopic.php?f=20&t=9934
Page 1 of 1

Author:  bjh [ Tue Aug 13, 2019 5:59 pm ]
Post subject:  Codesys Test Manager - Converting report xml to Junit format

Hello,

In this thread user Goof van de Weg mentioned that they had created a python script to convert exported Test Manager reports into a Junit format for Jenkins to recognize. As I don't believe he is active anymore I have created my own and wish to share it to those who would like to do the same.

Modify as you see fit - mine assumes that the test FBs are named FB_{FBNAME)_UNITTESTS and names the cases by each step of a multitest.

Install untangle, dateutil and junit_xml from pip or where ever you get your modules from

Code:
import untangle
import sys
from dateutil import parser
from junit_xml import TestSuite, TestCase

# Get time taken to execute test in seconds for JUnit report
def getTimeTaken(startTime, endTime):
    st = parser.parse(startTime)
    et = parser.parse(endTime)
    timedelta = et-st
    return timedelta.seconds


if len(sys.argv) == 1:
    o = untangle.parse('scripttest.xml')
    print("No argument received, using scripttest.xml")
else:
    print("Argument received, using TestManagerReport.xml")
    o = untangle.parse(
        'TestManagerReport.xml')

JunitTestCases = []
exitCode = 0
for CodesysTestCases in o.TestReport.Details.Sequence.TestCase:
    codesysTCName = str(CodesysTestCases['Name'])
    newTC = TestCase("","")
    newTC.status = CodesysTestCases.Result['State']
    newTC.elapsed_sec = getTimeTaken(CodesysTestCases.Timing.StartTime.cdata, CodesysTestCases.Timing.EndTime.cdata)
    chunksByUnderscore = codesysTCName
    chunksByUnderscore = chunksByUnderscore.split("_")

    chunksByColon = codesysTCName
    chunksByColon = chunksByColon.split(":")
    if chunksByUnderscore[0] == "FB":
        newTC.classname = chunksByUnderscore[0] + "_" + chunksByUnderscore[1]
        newTC.name = chunksByColon[1].strip() + ":" + chunksByColon[2]
    else:
        newTC.name = chunksByUnderscore[0]
        newTC.classname = "Test Script"
    if CodesysTestCases.Result['State'] == 'Failed':
        newTC.add_failure_info(CodesysTestCases.Result.AdditionalInformation.cdata)
        exitCode = 1
    JunitTestCases.append(newTC)

ts = TestSuite("Test Suite", JunitTestCases)

with open('junitreports.xml', 'w') as f:
    TestSuite.to_file(f, [ts], prettyprint=True)
if exitCode != 0:
    print("Failing Jenkins build due to test failure")
sys.exit(exitCode)

Author:  Aliazzz [ Tue Aug 20, 2019 8:17 pm ]
Post subject:  Re: Codesys Test Manager - Converting report xml to Junit format

Thank you!

Page 1 of 1 All times are UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/