Source code for ample.testing.unittest_util
"""Module containing a framework for unittesting of AMPLE modules"""
__author__ = "Felix Simkovic"
__date__ = "22 Mar 2016"
__version__ = "1.0"
import glob
import logging
import os
import sys
from ample.constants import AMPLE_DIR
from unittest import TestLoader, TextTestRunner, TestSuite
# Available packages. Hard-coded for now to show visually what we have in
# argparse module. Not needed otherwise
PACKAGES = ["ensembler", "modelling", "parsers", "util"]
logger = logging.getLogger(__name__)
[docs]def add_cmd_options(parser):
parser.add_argument(
'-b', dest='buffer', action="store_false", default=True, help="debugging by printing print messages"
)
parser.add_argument('test_cases', nargs='*', help="[ {0} ]".format(" | ".join(PACKAGES)))
parser.add_argument('-v', dest="verbosity", default=2, type=int, help="level of verbosity [default: 2]")
[docs]class AMPLEUnittestFramework(object):
"""Framework to run Ample unittesting"""
[docs] def run(self, buffer=False, cases=None, pattern="test*.py", verbosity=2):
"""Main routine for running the test cases"""
suite = SuiteLoader().load_suite(AMPLE_DIR, cases=cases, pattern=pattern)
if int(suite.countTestCases()) <= 0:
msg = 'Could not find any tests to run in directory: {0}'.format(AMPLE_DIR) + os.linesep
sys.stderr.write(msg)
sys.exit(1)
logging.disable(logging.CRITICAL)
TextTestRunner(verbosity=verbosity, buffer=buffer).run(suite)
logging.disable(logging.NOTSET)
[docs]class SuiteLoader(object):
"""Loader designed to obtain all test cases in a package"""
[docs] def load_suite(self, directory, pattern="test*.py", cases=None):
"""Load a unittest test suite"""
# If we do not have any test cases then we can search for some in
# the specified directory.
if not cases:
search_pattern = os.path.join(directory, "*")
cases = [os.path.basename(folder) for folder in glob.glob(search_pattern) if os.path.isdir(folder)]
return self._load_suite(cases, pattern, directory)
def _load_suite(self, cases, pattern, directory):
suite = TestSuite()
for case in cases:
path = os.path.join(directory, case)
try:
_suite = TestLoader().discover(path, pattern=pattern, top_level_dir=directory)
suite.addTests(_suite)
del _suite
except ImportError:
logger.debug("*** not a package: {0} ***".format(path))
return suite