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)