checker.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. '''
  2. @author: olivier.massot, 2018
  3. '''
  4. import inspect
  5. import sys
  6. UNKNOWN = 0
  7. SUCCESS = 1
  8. FAILURE = 2
  9. ERROR = 3
  10. _result_to_str = {UNKNOWN: 'Inconnu',
  11. SUCCESS: 'Succès',
  12. FAILURE: 'Echec',
  13. ERROR: 'Erreur'}
  14. class TestError():
  15. def __init__(self, message, info = {}, critical=False):
  16. self.message = message
  17. self.info = info
  18. self.critical = critical
  19. def __repr__(self):
  20. return f"TestError<message='{self.message}'; info={self.info}; critical={self.critical}>"
  21. class TestResult():
  22. def __init__(self, test):
  23. self._test = test
  24. self._name = ""
  25. self._status = UNKNOWN
  26. self.errors = []
  27. self._exc_info = None
  28. @property
  29. def name(self):
  30. return self._name or self._test.__name__[5:]
  31. @property
  32. def title(self):
  33. return self._test.__doc__.split("\n")[0].strip()
  34. @property
  35. def description(self):
  36. return self._test.__doc__.strip()
  37. @property
  38. def status(self):
  39. return self._status
  40. @property
  41. def status_str(self):
  42. return _result_to_str[self._status]
  43. def __repr__(self):
  44. return f"TestResult<title='{self.title}'; status={self.status}; name={self.name}; method={self._test.__name__}; errors_count={len(self.errors)}>"
  45. def log_error(self, message, info={}):
  46. self._status = FAILURE
  47. error = TestError(message, info)
  48. self.errors.append(error)
  49. def handle_exception(self):
  50. self._status = ERROR
  51. error = TestError("Une erreur inconnue s'est produite, veuillez consulter les fichiers de journalisation.",
  52. {"exc_info": sys.exc_info()})
  53. self.errors.append(error)
  54. class BaseChecker():
  55. def __init__(self):
  56. self._test_running = None
  57. def setUp(self):
  58. pass
  59. def tearDown(self):
  60. pass
  61. def log_error(self, message, info):
  62. self._test_running.log_error(message, info)
  63. def run(self):
  64. tests_results = []
  65. for mname, m in inspect.getmembers(self, predicate=inspect.ismethod):
  66. if mname[:5] == 'test_':
  67. r = TestResult(m)
  68. self._test_running = r
  69. self.setUp()
  70. try:
  71. m()
  72. except:
  73. r.handle_exception()
  74. self.tearDown()
  75. tests_results.append(r)
  76. return tests_results
  77. def test_a(self):
  78. """ Contrôle des données 1 """
  79. for i in range(10):
  80. self.log_error(f"error-{i}", {"i": i})
  81. def test_b(self):
  82. """ Contrôle des données 2
  83. bla bla bla """
  84. return True
  85. if __name__ == '__main__':
  86. ch = BaseChecker()
  87. results = ch.run()
  88. for r in results:
  89. print(r)
  90. for e in r.errors:
  91. print(e)