_paramtestpy2.py
96 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r2367 | """Implementation of the parametric test support for Python 2.x | ||
""" | ||||
Brian Granger
|
r2498 | |||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2009 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r2367 | #----------------------------------------------------------------------------- | ||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import unittest | ||||
from compiler.consts import CO_GENERATOR | ||||
#----------------------------------------------------------------------------- | ||||
# Classes and functions | ||||
#----------------------------------------------------------------------------- | ||||
def isgenerator(func): | ||||
try: | ||||
return func.func_code.co_flags & CO_GENERATOR != 0 | ||||
except AttributeError: | ||||
return False | ||||
class ParametricTestCase(unittest.TestCase): | ||||
"""Write parametric tests in normal unittest testcase form. | ||||
Limitations: the last iteration misses printing out a newline when running | ||||
in verbose mode. | ||||
""" | ||||
def run_parametric(self, result, testMethod): | ||||
# But if we have a test generator, we iterate it ourselves | ||||
testgen = testMethod() | ||||
while True: | ||||
try: | ||||
# Initialize test | ||||
result.startTest(self) | ||||
# SetUp | ||||
try: | ||||
self.setUp() | ||||
except KeyboardInterrupt: | ||||
raise | ||||
except: | ||||
result.addError(self, self._exc_info()) | ||||
return | ||||
# Test execution | ||||
ok = False | ||||
try: | ||||
testgen.next() | ||||
ok = True | ||||
except StopIteration: | ||||
# We stop the loop | ||||
break | ||||
except self.failureException: | ||||
result.addFailure(self, self._exc_info()) | ||||
except KeyboardInterrupt: | ||||
raise | ||||
except: | ||||
result.addError(self, self._exc_info()) | ||||
# TearDown | ||||
try: | ||||
self.tearDown() | ||||
except KeyboardInterrupt: | ||||
raise | ||||
except: | ||||
result.addError(self, self._exc_info()) | ||||
ok = False | ||||
if ok: result.addSuccess(self) | ||||
finally: | ||||
result.stopTest(self) | ||||
def run(self, result=None): | ||||
if result is None: | ||||
result = self.defaultTestResult() | ||||
testMethod = getattr(self, self._testMethodName) | ||||
# For normal tests, we just call the base class and return that | ||||
if isgenerator(testMethod): | ||||
return self.run_parametric(result, testMethod) | ||||
else: | ||||
return super(ParametricTestCase, self).run(result) | ||||
def parametric(func): | ||||
"""Decorator to make a simple function into a normal test via unittest.""" | ||||
class Tester(ParametricTestCase): | ||||
test = staticmethod(func) | ||||
Tester.__name__ = func.__name__ | ||||
return Tester | ||||