TdcResults.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/usr/bin/env python3
  2. from enum import Enum
  3. class ResultState(Enum):
  4. noresult = -1
  5. skip = 0
  6. success = 1
  7. fail = 2
  8. class TestResult:
  9. def __init__(self, test_id="", test_name=""):
  10. self.test_id = test_id
  11. self.test_name = test_name
  12. self.result = ResultState.noresult
  13. self.failmsg = ""
  14. self.errormsg = ""
  15. self.steps = []
  16. def set_result(self, result):
  17. if (isinstance(result, ResultState)):
  18. self.result = result
  19. return True
  20. else:
  21. raise TypeError('Unknown result type, must be type ResultState')
  22. def get_result(self):
  23. return self.result
  24. def set_errormsg(self, errormsg):
  25. self.errormsg = errormsg
  26. return True
  27. def append_errormsg(self, errormsg):
  28. self.errormsg = '{}\n{}'.format(self.errormsg, errormsg)
  29. def get_errormsg(self):
  30. return self.errormsg
  31. def set_failmsg(self, failmsg):
  32. self.failmsg = failmsg
  33. return True
  34. def append_failmsg(self, failmsg):
  35. self.failmsg = '{}\n{}'.format(self.failmsg, failmsg)
  36. def get_failmsg(self):
  37. return self.failmsg
  38. def add_steps(self, newstep):
  39. if type(newstep) == list:
  40. self.steps.extend(newstep)
  41. elif type(newstep) == str:
  42. self.steps.append(step)
  43. else:
  44. raise TypeError('TdcResults.add_steps() requires a list or str')
  45. def get_executed_steps(self):
  46. return self.steps
  47. class TestSuiteReport():
  48. def __init__(self):
  49. self._testsuite = []
  50. def add_resultdata(self, result_data):
  51. if isinstance(result_data, TestResult):
  52. self._testsuite.append(result_data)
  53. return True
  54. def count_tests(self):
  55. return len(self._testsuite)
  56. def count_failures(self):
  57. return sum(1 for t in self._testsuite if t.result == ResultState.fail)
  58. def count_skips(self):
  59. return sum(1 for t in self._testsuite if t.result == ResultState.skip)
  60. def find_result(self, test_id):
  61. return next((tr for tr in self._testsuite if tr.test_id == test_id), None)
  62. def update_result(self, result_data):
  63. orig = self.find_result(result_data.test_id)
  64. if orig != None:
  65. idx = self._testsuite.index(orig)
  66. self._testsuite[idx] = result_data
  67. else:
  68. self.add_resultdata(result_data)
  69. def format_tap(self):
  70. ftap = ""
  71. ftap += '1..{}\n'.format(self.count_tests())
  72. index = 1
  73. for t in self._testsuite:
  74. if t.result == ResultState.fail:
  75. ftap += 'not '
  76. ftap += 'ok {} {} - {}'.format(str(index), t.test_id, t.test_name)
  77. if t.result == ResultState.skip or t.result == ResultState.noresult:
  78. ftap += ' # skipped - {}\n'.format(t.errormsg)
  79. elif t.result == ResultState.fail:
  80. if len(t.steps) > 0:
  81. ftap += '\tCommands executed in this test case:'
  82. for step in t.steps:
  83. ftap += '\n\t\t{}'.format(step)
  84. ftap += '\n\t{}'.format(t.failmsg)
  85. ftap += '\n'
  86. index += 1
  87. return ftap
  88. def format_xunit(self):
  89. from xml.sax.saxutils import escape
  90. xunit = "<testsuites>\n"
  91. xunit += '\t<testsuite tests=\"{}\" skips=\"{}\">\n'.format(self.count_tests(), self.count_skips())
  92. for t in self._testsuite:
  93. xunit += '\t\t<testcase classname=\"{}\" '.format(escape(t.test_id))
  94. xunit += 'name=\"{}\">\n'.format(escape(t.test_name))
  95. if t.failmsg:
  96. xunit += '\t\t\t<failure>\n'
  97. if len(t.steps) > 0:
  98. xunit += 'Commands executed in this test case:\n'
  99. for step in t.steps:
  100. xunit += '\t{}\n'.format(escape(step))
  101. xunit += 'FAILURE: {}\n'.format(escape(t.failmsg))
  102. xunit += '\t\t\t</failure>\n'
  103. if t.errormsg:
  104. xunit += '\t\t\t<error>\n{}\n'.format(escape(t.errormsg))
  105. xunit += '\t\t\t</error>\n'
  106. if t.result == ResultState.skip:
  107. xunit += '\t\t\t<skipped/>\n'
  108. xunit += '\t\t</testcase>\n'
  109. xunit += '\t</testsuite>\n'
  110. xunit += '</testsuites>\n'
  111. return xunit