"""Universal launcher for unit tests""" import argparse import logging import os import sys import unittest def main(): """Parse args, collect tests and run them""" # Disable *.pyc files sys.dont_write_bytecode = True # Add ".." to module search path cur_dir = os.path.dirname(os.path.realpath(__file__)) top_dir = os.path.abspath(os.path.join(cur_dir, os.pardir)) sys.path.append(top_dir) # Parse command line arguments parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "-v", "--verbose", action="count", default=0, help="verbosity level, use: [-v | -vv | -vvv]", ) parser.add_argument( "-s", "--start-directory", default=None, help="directory to start discovery" ) parser.add_argument( "-p", "--pattern", default="test*.py", help="pattern to match test files ('test*.py' default)", ) parser.add_argument( "test", nargs="*", help="test specs (e.g. module.TestCase.test_func)" ) args = parser.parse_args() if not args.start_directory: args.start_directory = cur_dir if args.verbose > 2: logging.basicConfig(level=logging.DEBUG, format="DEBUG: %(message)s") loader = unittest.TestLoader() if args.test: # Add particular tests for test in args.test: suite = unittest.TestSuite() suite.addTests(loader.loadTestsFromName(test)) else: # Find all tests suite = loader.discover(args.start_directory, args.pattern) runner = unittest.TextTestRunner(verbosity=args.verbose) result = runner.run(suite) return result.wasSuccessful() if __name__ == "__main__": # NOTE: True(success) -> 0, False(fail) -> 1 exit(not main())