0001
0002
0003 from enum import Enum
0004
0005 class ResultState(Enum):
0006 noresult = -1
0007 skip = 0
0008 success = 1
0009 fail = 2
0010
0011 class TestResult:
0012 def __init__(self, test_id="", test_name=""):
0013 self.test_id = test_id
0014 self.test_name = test_name
0015 self.result = ResultState.noresult
0016 self.failmsg = ""
0017 self.errormsg = ""
0018 self.steps = []
0019
0020 def set_result(self, result):
0021 if (isinstance(result, ResultState)):
0022 self.result = result
0023 return True
0024 else:
0025 raise TypeError('Unknown result type, must be type ResultState')
0026
0027 def get_result(self):
0028 return self.result
0029
0030 def set_errormsg(self, errormsg):
0031 self.errormsg = errormsg
0032 return True
0033
0034 def append_errormsg(self, errormsg):
0035 self.errormsg = '{}\n{}'.format(self.errormsg, errormsg)
0036
0037 def get_errormsg(self):
0038 return self.errormsg
0039
0040 def set_failmsg(self, failmsg):
0041 self.failmsg = failmsg
0042 return True
0043
0044 def append_failmsg(self, failmsg):
0045 self.failmsg = '{}\n{}'.format(self.failmsg, failmsg)
0046
0047 def get_failmsg(self):
0048 return self.failmsg
0049
0050 def add_steps(self, newstep):
0051 if type(newstep) == list:
0052 self.steps.extend(newstep)
0053 elif type(newstep) == str:
0054 self.steps.append(step)
0055 else:
0056 raise TypeError('TdcResults.add_steps() requires a list or str')
0057
0058 def get_executed_steps(self):
0059 return self.steps
0060
0061 class TestSuiteReport():
0062 _testsuite = []
0063
0064 def add_resultdata(self, result_data):
0065 if isinstance(result_data, TestResult):
0066 self._testsuite.append(result_data)
0067 return True
0068
0069 def count_tests(self):
0070 return len(self._testsuite)
0071
0072 def count_failures(self):
0073 return sum(1 for t in self._testsuite if t.result == ResultState.fail)
0074
0075 def count_skips(self):
0076 return sum(1 for t in self._testsuite if t.result == ResultState.skip)
0077
0078 def find_result(self, test_id):
0079 return next((tr for tr in self._testsuite if tr.test_id == test_id), None)
0080
0081 def update_result(self, result_data):
0082 orig = self.find_result(result_data.test_id)
0083 if orig != None:
0084 idx = self._testsuite.index(orig)
0085 self._testsuite[idx] = result_data
0086 else:
0087 self.add_resultdata(result_data)
0088
0089 def format_tap(self):
0090 ftap = ""
0091 ftap += '1..{}\n'.format(self.count_tests())
0092 index = 1
0093 for t in self._testsuite:
0094 if t.result == ResultState.fail:
0095 ftap += 'not '
0096 ftap += 'ok {} {} - {}'.format(str(index), t.test_id, t.test_name)
0097 if t.result == ResultState.skip or t.result == ResultState.noresult:
0098 ftap += ' # skipped - {}\n'.format(t.errormsg)
0099 elif t.result == ResultState.fail:
0100 if len(t.steps) > 0:
0101 ftap += '\tCommands executed in this test case:'
0102 for step in t.steps:
0103 ftap += '\n\t\t{}'.format(step)
0104 ftap += '\n\t{}'.format(t.failmsg)
0105 ftap += '\n'
0106 index += 1
0107 return ftap
0108
0109 def format_xunit(self):
0110 from xml.sax.saxutils import escape
0111 xunit = "<testsuites>\n"
0112 xunit += '\t<testsuite tests=\"{}\" skips=\"{}\">\n'.format(self.count_tests(), self.count_skips())
0113 for t in self._testsuite:
0114 xunit += '\t\t<testcase classname=\"{}\" '.format(escape(t.test_id))
0115 xunit += 'name=\"{}\">\n'.format(escape(t.test_name))
0116 if t.failmsg:
0117 xunit += '\t\t\t<failure>\n'
0118 if len(t.steps) > 0:
0119 xunit += 'Commands executed in this test case:\n'
0120 for step in t.steps:
0121 xunit += '\t{}\n'.format(escape(step))
0122 xunit += 'FAILURE: {}\n'.format(escape(t.failmsg))
0123 xunit += '\t\t\t</failure>\n'
0124 if t.errormsg:
0125 xunit += '\t\t\t<error>\n{}\n'.format(escape(t.errormsg))
0126 xunit += '\t\t\t</error>\n'
0127 if t.result == ResultState.skip:
0128 xunit += '\t\t\t<skipped/>\n'
0129 xunit += '\t\t</testcase>\n'
0130 xunit += '\t</testsuite>\n'
0131 xunit += '</testsuites>\n'
0132 return xunit