Pyunit is a unit tests framework for Python. I believe it is the standard one. It works very well, however to run all the tests within a folder might be not trivial. You can do either hardcode the tests names to build the test suite or use this helper. The helper uses introspection (what is called reflection on .Net):
import unittest
import os
import re
import sys
import inspect
import types
def makeSuite(testsFolder = './tests', testsPackageName = 'tests', testClassSuffix='Tests'):
"""Given the testsFolder parameter, loads all the .py files to search for classes
which name contains testClassSuffix and inherit from unittest.TestCase.
It takes these classes to buid the TestSuite and run all the tests.
"""
testClasses = []
testModules = {}
testPackage = None
suite = unittest.TestSuite()
folder = os.listdir(testsFolder)
for moduleName in folder:
modulePath = os.path.join(testsFolder, moduleName)
if not os.path.isdir(modulePath) and re.search(".py$", moduleName) :
fullModuleName = testsPackageName + '.' + moduleName[:-3]
# curious: this imports the package not the module
testPackage = __import__(fullModuleName)
# it is weird indeed as __import__('packageName') does not load its modules
for packageItem in dir(testPackage):
if re.search(testClassSuffix, packageItem):
if not testModules.has_key(packageItem):
testModules[packageItem] = True
moduleHandler = getattr(testPackage, packageItem)
for className, classHandler in inspect.getmembers(moduleHandler, callable):
if inspect.isclass(classHandler) and issubclass(classHandler, unittest.TestCase):
testClasses.append(classHandler)
for classHandler in testClasses:
for name, value in inspect.getmembers(classHandler, callable):
if re.match("test", name):
print " - Test:", name
suite.addTest(classHandler(name))
return suite
if __name__ == "__main__":
suite = makeSuite()
runner = unittest.TextTestRunner()
runner.run(suite)