Source code for pySPACE.tests.check_unittests
#!/usr/bin/env python
"""
This module checks whether the unittests for every nodes exist.
If [-l] option is specified, the result will be printed into log file
'check_unittests_logger_YYYY-MM-DD_HH-MM-SS.log' in the current directory.
**Options**
:-l: -- prints the result into log file
:-log: -- prints the result into log file
:Author: Titiruck Nuntapramote (titiruck.nuntapramote@dfki.de)
:Created: 2012/01/03
"""
import os
import inspect
import sys
import logging
import datetime
if __name__ == '__main__':
file_path = os.path.dirname(os.path.abspath(__file__))
pyspace_path = file_path[:file_path.rfind('pySPACE') - 1]
if not (pyspace_path in sys.path):
sys.path.append(pyspace_path)
import pySPACE.missions.nodes as nodes
import pySPACE.resources.data_types as data_types
[docs]def existing_test(lst, dir, files):
""" Function to get a list of existing test
**Arguments**
:lst: -- The test suite, to which the tests are added.
:dir: -- The directory which contains the files
:files: -- List of files
"""
for file in files:
# figure out module name
moduleName = dir.strip("\.\/").replace("/", ".")
if len(moduleName):
moduleName += "."
if os.path.splitext(file)[1] == '.py':
moduleName += os.path.splitext(file)[0]
print moduleName
__import__(moduleName)
module = sys.modules[moduleName]
for name, obj in inspect.getmembers(module, inspect.isclass):
if name.endswith('TestCase'):
name = name[:-8]
# print name + ": " + moduleName
lst[name] = moduleName
[docs]def get_class(module, lst):
"""
Function to get a list of class.
For now, this is only used to get classes in datatype.
**Arguments**
:module: -- Module to get classes from
:lst: -- list of classes
"""
for name, obj in inspect.getmembers(module, inspect.ismodule):
__import__(obj.__name__)
new_module = sys.modules[obj.__name__]
for name2, obj2 in inspect.getmembers(new_module, inspect.isclass):
# print name2 + ":" + str(obj2)
lst[name2] = obj2
if __name__ == '__main__':
log = False
if len(sys.argv) == 2:
arg = sys.argv[1]
if arg == '-l' or arg == '-log':
log = True
else:
print "usage: run_tests.py [-l|-log](enable logging)"
exit()
elif len(sys.argv) > 2:
print "usage: run_tests.py [-l|-log](enable logging)"
exit()
if log is True:
dateTag = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
LOG_FILENAME = "check_unittests_logger_%s.log" % dateTag
FORMATTER = '%(message)s'
logging.basicConfig(
filename=LOG_FILENAME, level=logging.INFO, format=FORMATTER)
# list for nodes
nodelist = nodes.DEFAULT_NODE_MAPPING
# collect classes from pySPACE.resources.data_types
typelist = {}
get_class(data_types, typelist)
testnode = {}
testtype = {}
# list of node class with no unittests
NO_testnode = {}
NO_testtype = {}
# the list HAVE_test* is not the same as test*
# because the matching of node names and node class is not 1 to 1
# some node class e.g. FIRFilterNode exists as BandPassFilter,
# LowPassFilter, and more
HAVE_testnode = {}
HAVE_testtype = {}
# collect test cases from nodes
os.path.walk(os.curdir + '/unittests/nodes', existing_test, testnode)
# collect test cases from data_types
os.path.walk(os.curdir + '/unittests/data_types', existing_test, testtype)
# compare tests with nodes and then print
print "Nodes without test ------------------------------------------"
for key, value in sorted(nodelist.iteritems(), key=lambda t: str(t[1])):
# -6 comes from deleting "Node'>"
if (str(value).split('.')[-1])[:-6] not in testnode:
NO_testnode[key] = value
# print "\t" + key + ": "
print "\t\t" + str(value).split('\'')[1]
else:
HAVE_testnode[key] = value
print "Existing nodes: ", len(nodelist)
print "Nodes with test: ", len(HAVE_testnode), \
"(actual existing unittests:", len(testnode), ")"
print "Nodes without test: ", len(NO_testnode)
# compare tests with data_types and then print
print "Types without test ------------------------------------------"
for key, value in typelist.iteritems():
if key not in testtype:
NO_testtype[key] = value
print "\t" + key + ": "
print "\t " + str(value).split('\'')[1]
else:
HAVE_testtype[key] = value
print "Existing types: ", len(typelist)
print "Types with test: ", len(HAVE_testtype)
print "Types without test: ", len(NO_testtype)
print "-------------------------------------------------------------"
print "Total existing tests: ", len(testnode) + len(testtype)
# if logging is enabled, print to log
if log is True:
logging.info("Nodes without test -----------------------------------")
for key, value in NO_testnode.iteritems():
logging.info("\t" + key + ": " + str(value)[22:-2])
logging.info("\tExisting nodes: " + str(len(nodelist)))
logging.info("\tNodes with test: " + str(len(HAVE_testnode)) +
"(actual existing tests: " + str(len(testnode)) + ")")
logging.info("\tNodes without test: " + str(len(NO_testnode)))
logging.info("Types without test -----------------------------------")
for key, value in NO_testtype.iteritems():
logging.info("\t" + key + ": " + str(value)[22:-2])
logging.info("\tExisting types: " + str(len(typelist)))
logging.info("\tTypes with test: " + str(len(HAVE_testtype)))
logging.info("\tTypes without test: " + str(len(NO_testtype)))