6This script can be used to write test results to XML file in JUnit
7format. Not all tags supported by JUnit are provided, but the script
8can easily be expanded to support them.
10See function main() below for example of usage.
17 This class contains result of one test case.
20 def __init__(self, testId, testedItem,
27 self._testedItem = testedItem
28 self._isError = isError
29 self._isFailure = isFailure
30 self._errorFailureType = errorFailureType
31 self._errorFailureDesc = errorFailureDesc
36 def getTestedItem(self):
37 return self._testedItem
43 return self._isFailure
45 def getErrorFailureType(self):
46 return self._errorFailureType
48 def getErrorFailureDesc(self):
49 return self._errorFailureDesc
52class _TestReportStatistics:
54 This class contains test statistics. For internal usage only.
56 def __init__(self, noOfErrors, noOfFailures):
57 self._noOfErrors = noOfErrors
58 self._noOfFailures = noOfFailures
60 def getNoOfErrors(self):
61 return self._noOfErrors
63 def getNoOfFailures(self):
64 return self._noOfFailures
67def saveTestResultsAsJUnit(fileName, testSuiteName, testResults):
69 This method saves test results in Junit format, so that it can be parsed
70 by Jenkins/Hudson. This method creates file
with one test suite.
72 For details about the format see:
73 https://stackoverflow.com/questions/4922867/junit-xml-format-specification-that-hudson-supports
76 https://svn.jenkins-ci.org/trunk/hudson/dtkit/dtkit-format/dtkit-junit-model/src/main/resources/com/thalesgroup/dtkit/junit/model/xsd/junit-4.xsd
80 fileName - name of file to save report to
81 testSuiteName - name of test suite which
is used
for attribute name:
82 '<testsuite name="' + testSuiteName +
'" ...
83 testResults - list of TestResult instances
85 Example of generated file:
86 <testsuites name="testIDEATestSuite" tests=
"3" errors=
"0" failures=
"0">
87 <testsuite name=
"testIDEATestSuite" tests=
"3" errors=
"0" failures=
"0">
88 <testcase classname=
"add_int" name=
"test-0"/>
89 <testcase classname=
"add_int" name=
"test-1"
90 <error type=
"exception"/>Invalid value!</error>
92 <testcase classname=
"max_int" name=
"test-2">
93 <failure type=
"expression"></failure>
99 reportStats = _getReportStatistics(testResults)
101 with open(fileName,
'w')
as of:
102 _saveTestResultsAsJUnitStart(of,
105 reportStats.getNoOfErrors(),
106 reportStats.getNoOfFailures())
108 _saveTestResultsAsJUnitForTestSuite(of,
112 _saveTestResultsAsJUnitEnd(of)
115def _saveTestResultsAsJUnitStart(of, testSuitesName, noOfTests, noOfErrors,
118 This method saves test results in Junit format, so that it can be parsed
119 by Jenkins/Hudson. Typical usage:
121 saveTestResultsAsJUnitStart(...)
122 saveTestResultsAsJUnitForTestSuite(...)
123 saveTestResultsAsJUnitEnd()
127 of - opened file stream
128 testSuitesName - values
for the
'name' attribute of tags
'testsuites' and
130 noOfTests - number of all tests
in test suite
131 noOfErrors - number of errors
132 noOfFailures - number of failures
134 For details about format see method _saveTestResultsAsJUnit().
137 of.write('<?xml version="1.0" encoding="UTF-8"?>\n')
139 of.write(
'<testsuites name="' + testSuitesName +
'" tests="' +
140 str(noOfTests) +
'" errors="' +
141 str(noOfErrors) +
'" failures="' +
142 str(noOfFailures) +
'">\n')
145def _saveTestResultsAsJUnitForTestSuite(of, testSuiteName, testResults, reportStats):
147 This method saves test results in JUnit format, so that it can be parsed
148 by Jenkins/Hudson
for one test suite. Typical usage:
150 saveTestResultsAsJUnitStart(...)
151 saveTestResultsAsJUnitForTestSuite(...)
152 saveTestResultsAsJUnitEnd()
154 See method _saveTestResultsAsJUnitStart()
for details.
157 of.write(' <testsuite name="' + testSuiteName +
'" tests="' +
158 str(len(testResults)) +
'" errors="' +
159 str(reportStats.getNoOfErrors()) +
'" failures="' +
160 str(reportStats.getNoOfFailures()) +
'">\n')
162 for tr
in testResults:
164 of.write(
' <testcase classname="' + tr.getTestedItem() +
'" name="' +
165 tr.getTestId() +
'">\n')
168 of.write(
' <error type="' + tr.getErrorFailureType() +
'">')
169 of.write(_replaceXMLEntities(tr.getErrorFailureDesc()))
170 of.write(
'</error>\n')
173 of.write(
' <failure type="' + tr.getErrorFailureType() +
'">')
174 of.write(_replaceXMLEntities(tr.getErrorFailureDesc()))
175 of.write(
'</failure>\n')
177 of.write(
' </testcase>\n')
178 of.write(
' </testsuite>\n')
181def _saveTestResultsAsJUnitEnd(of):
183 This method adds the last tag to XML file in Jenkins/Hudson format.
184 See method saveTestResultsAsJUnitStart()
for details.
186 of.write('</testsuites>\n')
189def _getReportStatistics(testResults):
194 for tr
in testResults:
202 return _TestReportStatistics(noOfErrors, noOfFailures)
206def _replaceXMLEntities(message):
207 message = message.replace(
'<',
'<')
208 message = message.replace(
'>',
'>')
209 message = message.replace(
'&',
'&')
210 message = message.replace(
'"',
'"')
211 message = message.replace(
"'",
''')
217 This function demonstrates usage of this module.
221 testResults = [TestResult(
'test-01',
'HandBrake'),
222 TestResult(
'test-02',
'HandBrake'),
223 TestResult(
'test-03',
'HandBrake', isFailure =
True,
224 errorFailureType=
'expression',
225 errorFailureDesc=
'voltage < 3.14'),
227 TestResult(
'test-03',
'HandBrake', isError =
True,
228 errorFailureType=
'exception',
229 errorFailureDesc=
'FileNotFoundException')
233 outFName =
'testReport.xml'
234 saveTestResultsAsJUnit(outFName,
'iSYSTEM HIL test', testResults)
235 print(
"Sample report saved to '" + outFName +
"'")
238if __name__ ==
'__main__':