Codesys Test Manager - Converting report xml to Junit format

bjh
2019-08-13
2019-08-20
  • bjh

    bjh - 2019-08-13

    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

    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)
    
     
  • aliazzz

    aliazzz - 2019-08-20

    Thank you!

     

Log in to post a comment.