assamtest

mocha-style tests for python
git clone https://git.ce9e.org/assamtest.git

commit
543cb7041c9fa3237a6d4bd6824ba451aecfbab1
parent
38ee7e677ca8d1b13997479e72ab152bef520555
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2019-02-09 09:47
outcomes

Diffstat

M assamtest/decorators.py 3 ++-
M assamtest/reporter.py 51 +++++++++++++++++++++++++++++++++++----------------
M assamtest/runner.py 21 ++++++++++++++++++---

3 files changed, 55 insertions, 20 deletions


diff --git a/assamtest/decorators.py b/assamtest/decorators.py

@@ -2,6 +2,7 @@ import asyncio
    2     2 import functools
    3     3 
    4     4 from .expect import expect
   -1     5 from .runner import Outcome
    5     6 
    6     7 
    7     8 def fail(fn):
@@ -15,7 +16,7 @@ def fail(fn):
   15    16 def skip(fn):
   16    17 	@functools.wraps(fn)
   17    18 	def wrapper(*args, **kwargs):
   18    -1 		pass
   -1    19 		raise Outcome(None, 'skipped', 'INFO')
   19    20 	return wrapper
   20    21 
   21    22 

diff --git a/assamtest/reporter.py b/assamtest/reporter.py

@@ -26,7 +26,7 @@ class Reporter:
   26    26 	def leave_suite(self, name):
   27    27 		pass
   28    28 
   29    -1 	def test(self, name, result):
   -1    29 	def test(self, name, err, status, level):
   30    30 		pass
   31    31 
   32    32 
@@ -34,23 +34,39 @@ class SpecReporter(Reporter):
   34    34 	def __init__(self):
   35    35 		self.stack = []
   36    36 		self.stats = {
   37    -1 			'fail': 0,
   38    -1 			'pass': 0,
   -1    37 			'SUCCESS': {},
   -1    38 			'INFO': {},
   -1    39 			'WARNING': {},
   -1    40 			'ERROR': {},
   39    41 		}
   40    42 
   -1    43 	def render_level(self, msg, level, status):
   -1    44 		if status == 'passed':
   -1    45 			char = '✓'
   -1    46 		elif status == 'failed':
   -1    47 			char = '✖'
   -1    48 		else:
   -1    49 			char = status[0].upper()
   -1    50 		color = {
   -1    51 			'SUCCESS': 'GREEN',
   -1    52 			'INFO': 'CYAN',
   -1    53 			'WARNING': 'YELLOW',
   -1    54 			'ERROR': 'RED',
   -1    55 		}[level]
   -1    56 		return colored('%s %s' % (char, msg), color)
   -1    57 
   41    58 	def _print(self, msg):
   42    59 		print('  ' * len(self.stack) + msg)
   43    60 
   44    61 	def leave_run(self):
   45    62 		print()
   46    -1 		if self.stats['pass']:
   47    -1 			print(colored('✓ %i passing' % self.stats['pass'], 'GREEN'))
   48    -1 		if self.stats['fail']:
   49    -1 			print(colored('✖ %i failing' % self.stats['fail'], 'RED'))
   -1    63 		for level in ['SUCCESS', 'INFO', 'WARNING', 'ERROR']:
   -1    64 			for status, count in sorted(self.stats[level].items()):
   -1    65 				print(self.render_level('%i %s' % (count, status), level, status))
   50    66 
   51    -1 		if self.stats['fail']:
   -1    67 		if sum(self.stats['ERROR'].values()) != 0:
   52    68 			return 1
   53    -1 		elif sum(self.stats.values()) == 0:
   -1    69 		elif sum(sum(l.values()) for l in self.stats.values()) == 0:
   54    70 			print(colored('No tests found', 'YELLOW'))
   55    71 			return 5
   56    72 
@@ -61,11 +77,14 @@ class SpecReporter(Reporter):
   61    77 	def leave_suite(self, name):
   62    78 		self.stack.pop()
   63    79 
   64    -1 	def test(self, name, result):
   65    -1 		if result:
   66    -1 			self.stats['fail'] += 1
   67    -1 			self._print(colored('✖ %s' % name, 'RED'))
   68    -1 			self._print('    %s' % result)
   -1    80 	def test(self, name, err, status, level):
   -1    81 		self.stats[level].setdefault(status, 0)
   -1    82 		self.stats[level][status] += 1
   -1    83 
   -1    84 		if level == 'SUCCESS':
   -1    85 			self._print(self.render_level('', level, status) + colored(name, 'DIM'))
   69    86 		else:
   70    -1 			self.stats['pass'] += 1
   71    -1 			self._print('%s %s' % (colored('✓', 'GREEN'), colored(name, 'DIM')))
   -1    87 			self._print(self.render_level(name, level, status))
   -1    88 
   -1    89 		if err and str(err):
   -1    90 			self._print('    %s' % err)

diff --git a/assamtest/runner.py b/assamtest/runner.py

@@ -1,8 +1,23 @@
   -1     1 class Outcome(Exception):
   -1     2 	def __init__(self, err, status, level):
   -1     3 		self.err = err
   -1     4 		self.status = status
   -1     5 		self.level = level
   -1     6 
   -1     7 	def __str__(self):
   -1     8 		return str(self.err or '')
   -1     9 
   -1    10 
    1    11 def run_test(test):
    2    12 	try:
    3    13 		test()
    4    -1 	except Exception as e:
    5    -1 		return e
   -1    14 	except Outcome as err:
   -1    15 		return err, err.status, err.level
   -1    16 	except AssertionError as err:
   -1    17 		return err, 'failed', 'ERROR'
   -1    18 	except Exception as err:
   -1    19 		return err, 'errored', 'ERROR'
   -1    20 	return None, 'passed', 'SUCCESS'
    6    21 
    7    22 
    8    23 def _run(suite, reporter, before_each=[], after_each=[]):
@@ -18,7 +33,7 @@ def _run(suite, reporter, before_each=[], after_each=[]):
   18    33 		for fn in before_each:
   19    34 			fn()
   20    35 
   21    -1 		reporter.test(name, run_test(test))
   -1    36 		reporter.test(name, *run_test(test))
   22    37 
   23    38 		for fn in after_each:
   24    39 			fn()