134 lines · python
1#!/usr/bin/env python32 3from enum import Enum4 5class ResultState(Enum):6 noresult = -17 skip = 08 success = 19 fail = 210 11class TestResult:12 def __init__(self, test_id="", test_name=""):13 self.test_id = test_id14 self.test_name = test_name15 self.result = ResultState.noresult16 self.failmsg = ""17 self.errormsg = ""18 self.steps = []19 20 def set_result(self, result):21 if (isinstance(result, ResultState)):22 self.result = result23 return True24 else:25 raise TypeError('Unknown result type, must be type ResultState')26 27 def get_result(self):28 return self.result29 30 def set_errormsg(self, errormsg):31 self.errormsg = errormsg32 return True33 34 def append_errormsg(self, errormsg):35 self.errormsg = '{}\n{}'.format(self.errormsg, errormsg)36 37 def get_errormsg(self):38 return self.errormsg39 40 def set_failmsg(self, failmsg):41 self.failmsg = failmsg42 return True43 44 def append_failmsg(self, failmsg):45 self.failmsg = '{}\n{}'.format(self.failmsg, failmsg)46 47 def get_failmsg(self):48 return self.failmsg49 50 def add_steps(self, newstep):51 if type(newstep) == list:52 self.steps.extend(newstep)53 elif type(newstep) == str:54 self.steps.append(step)55 else:56 raise TypeError('TdcResults.add_steps() requires a list or str')57 58 def get_executed_steps(self):59 return self.steps60 61class TestSuiteReport():62 def __init__(self):63 self._testsuite = []64 65 def add_resultdata(self, result_data):66 if isinstance(result_data, TestResult):67 self._testsuite.append(result_data)68 return True69 70 def count_tests(self):71 return len(self._testsuite)72 73 def count_failures(self):74 return sum(1 for t in self._testsuite if t.result == ResultState.fail)75 76 def count_skips(self):77 return sum(1 for t in self._testsuite if t.result == ResultState.skip)78 79 def find_result(self, test_id):80 return next((tr for tr in self._testsuite if tr.test_id == test_id), None)81 82 def update_result(self, result_data):83 orig = self.find_result(result_data.test_id)84 if orig != None:85 idx = self._testsuite.index(orig)86 self._testsuite[idx] = result_data87 else:88 self.add_resultdata(result_data)89 90 def format_tap(self):91 ftap = ""92 ftap += '1..{}\n'.format(self.count_tests())93 index = 194 for t in self._testsuite:95 if t.result == ResultState.fail:96 ftap += 'not '97 ftap += 'ok {} {} - {}'.format(str(index), t.test_id, t.test_name)98 if t.result == ResultState.skip or t.result == ResultState.noresult:99 ftap += ' # skipped - {}\n'.format(t.errormsg)100 elif t.result == ResultState.fail:101 if len(t.steps) > 0:102 ftap += '\tCommands executed in this test case:'103 for step in t.steps:104 ftap += '\n\t\t{}'.format(step)105 ftap += '\n\t{}'.format(t.failmsg)106 ftap += '\n'107 index += 1108 return ftap109 110 def format_xunit(self):111 from xml.sax.saxutils import escape112 xunit = "<testsuites>\n"113 xunit += '\t<testsuite tests=\"{}\" skips=\"{}\">\n'.format(self.count_tests(), self.count_skips())114 for t in self._testsuite:115 xunit += '\t\t<testcase classname=\"{}\" '.format(escape(t.test_id))116 xunit += 'name=\"{}\">\n'.format(escape(t.test_name))117 if t.failmsg:118 xunit += '\t\t\t<failure>\n'119 if len(t.steps) > 0:120 xunit += 'Commands executed in this test case:\n'121 for step in t.steps:122 xunit += '\t{}\n'.format(escape(step))123 xunit += 'FAILURE: {}\n'.format(escape(t.failmsg))124 xunit += '\t\t\t</failure>\n'125 if t.errormsg:126 xunit += '\t\t\t<error>\n{}\n'.format(escape(t.errormsg))127 xunit += '\t\t\t</error>\n'128 if t.result == ResultState.skip:129 xunit += '\t\t\t<skipped/>\n'130 xunit += '\t\t</testcase>\n'131 xunit += '\t</testsuite>\n'132 xunit += '</testsuites>\n'133 return xunit134