import os import sys from unittest import defaultTestLoader, TextTestRunner, TestSuite MODULE_NAMES = ["test_clientform", "test_mutation"] class TestProgram: """A command-line program that runs a set of tests; this is primarily for making test modules conveniently executable. """ USAGE = """\ Usage: %(progName)s [options] [test] [...] Options: -h, --help Show this message -v, --verbose Verbose output -q, --quiet Minimal output """ USAGE_EXAMPLES = """ Examples: %(progName)s - run all tests %(progName)s test_mutation - run module 'test_mutation' %(progName)s test_mutation.MutationTests - run all 'test*' test methods in test_mutation.MutationTests %(progName)s test_mutation.MutationTests.test_add_textfield - run test_mutation.MutationTests.test_add_textfield """ def __init__(self, moduleNames, defaultTest=None, argv=None, testRunner=None, testLoader=defaultTestLoader, defaultUri="http://wwwsearch.sourceforge.net/", usageExamples=USAGE_EXAMPLES, ): self.modules = [] for moduleName in moduleNames: module = __import__(moduleName) for part in moduleName.split('.')[1:]: module = getattr(module, part) self.modules.append(module) self.uri = None self._defaultUri = defaultUri if argv is None: argv = sys.argv self.verbosity = 1 self.defaultTest = defaultTest self.testRunner = testRunner self.testLoader = testLoader self.progName = os.path.basename(argv[0]) self.usageExamples = usageExamples self.parseArgs(argv) def usageExit(self, msg=None): if msg: print msg print (self.USAGE + self.usageExamples) % self.__dict__ sys.exit(2) def parseArgs(self, argv): import getopt try: options, args = getopt.getopt( argv[1:], 'hHvq', ['help', 'verbose', 'quiet'], ) for opt, value in options: if opt in ('-h','-H','--help'): self.usageExit() if opt in ('-q','--quiet'): self.verbosity = 0 if opt in ('-v','--verbose'): self.verbosity = 2 if len(args) == 0 and self.defaultTest is None: suite = TestSuite() for module in self.modules: test = self.testLoader.loadTestsFromModule(module) suite.addTest(test) self.test = suite return if len(args) > 0: self.testNames = args else: self.testNames = (self.defaultTest,) self.createTests() except getopt.error, msg: self.usageExit(msg) def createTests(self): self.test = self.testLoader.loadTestsFromNames(self.testNames) def runTests(self): if self.testRunner is None: self.testRunner = TextTestRunner(verbosity=self.verbosity) return self.testRunner.run(self.test) def main(): test_path = os.path.join(os.path.dirname(sys.argv[0]), "test") sys.path.insert(0, test_path) try: import warnings except ImportError: pass else: warnings.filterwarnings( action="ignore", message="import \* only allowed at module level") prog = TestProgram(MODULE_NAMES) result = prog.runTests() sys.exit(not result.wasSuccessful()) if __name__ == "__main__": main()