# A script to enable execution of any python unit test in this directory.
# It will be called when Python tries to 'execute' this directory
"""
Usage:
* execute all unit tests in this dir
python
[options] [-a]
* execute a certain set of tests
python [options] ...
Options:
-f: failfast (abort with the first test that fails)
-v, -vv: increase verbosity
-q: reduce verbosity
-d LEVEL: set debug level
"""
from __future__ import print_function
import re
import unittest
import os.path
import sys
# --------------------------------------------------------------------
def script_list( path ):
"""
Get all the python scripts in a directory. Scripts are taken as all
files ending in ``.py`` that do not start with an underscore or dot.
"""
regexp = re.compile( r'^([^_\.].+)\.py$' )
r = []
for f in os.listdir(path):
if os.path.isdir( os.path.join(path,f) ):
continue
m = regexp.match(f)
if m:
r.append( m.group(1) )
return sorted(r)
# --------------------------------------------------------------------
def default_opts():
'''Default options'''
return type( "options", (),
{ 'help' : False,
'all' : False,
'quiet' : False,
'failfast': False,
'verbosity': 1 } )
def read_opts():
'''Read command-line options'''
# Default options
opt = default_opts()
# Detect options
while len(sys.argv) > 1 and sys.argv[1].startswith('-'):
if sys.argv[1] == '-h':
opt.help = True
elif sys.argv[1] == '-q':
opt.quiet = True
elif sys.argv[1] == '-v':
opt.verbosity = 2
elif sys.argv[1] == '-vv':
opt.verbosity = 3
elif sys.argv[1] in ('-a','-all','--all'):
opt.all = True
elif sys.argv[1] in ('-f'):
opt.failfast = True
elif sys.argv[1] == '-d':
import logging
logging.basicConfig( level=sys.argv[2],
format='%(levelname)s %(filename)s %(funcName)s: %(message)s' )
sys.argv.pop(1)
sys.argv.pop(1) # remove the just-used argument
return opt
# --------------------------------------------------------------------
def load_tests( opt=None ):
'''Load the test suite by adding all python files in this directory'''
if opt is None:
opt = default_opts()
thisdir = os.path.dirname(__file__)
# Select the test(s) to run
if __name__ != '__main__' or len(sys.argv) < 2 or opt.all:
test_list = script_list( thisdir )
else:
test_list = [ t if t.startswith('test_') else 'test_' + t
for t in sys.argv[1:] ]
loader = unittest.defaultTestLoader
suite = unittest.TestSuite()
# Add the base path of python-aiml sources
sys.path.insert( 0, os.path.dirname(thisdir) )
# Add all requested unit tests
if not opt.quiet:
print( "\n******************************\n" )
for test in test_list:
if not opt.quiet:
print( "Loading unit test '" + test + "'" )
suite.addTest( loader.loadTestsFromName( 'test.' + test ) )
return suite
if __name__ == '__main__':
# Usage message
opt = read_opts()
if opt.help:
print( __doc__ )
sys.exit(1)
# Load the tests
suite = load_tests( opt )
# Run the tests
if not opt.quiet:
print( "\n\nRunning test suite\n" )
try:
testrunner = unittest.TextTestRunner( verbosity=opt.verbosity )
testrunner.failfast = opt.failfast
testrunner.run( suite )
except KeyboardInterrupt as err:
print( "Interrupted!! :", err )
sys.exit(1)