Back to home page

OSCL-LXR

 
 

    


0001 #!/usr/bin/env python3
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