diff options
author | Jason Pellerin <jpellerin@gmail.com> | 2009-04-18 19:00:45 +0000 |
---|---|---|
committer | Jason Pellerin <jpellerin@gmail.com> | 2009-04-18 19:00:45 +0000 |
commit | c5bd03442781ce1c974920708e958d58d1ff6289 (patch) | |
tree | 04041c48ada439b6ca6510bb34007f7dd94b33be /nose/plugins/collect.py | |
parent | 296fee10bf942cf860326c88d5c5df6e906a8c7b (diff) | |
download | nose-c5bd03442781ce1c974920708e958d58d1ff6289.tar.gz |
Committed PyCon sprint work.
Diffstat (limited to 'nose/plugins/collect.py')
-rw-r--r-- | nose/plugins/collect.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/nose/plugins/collect.py b/nose/plugins/collect.py new file mode 100644 index 0000000..0685971 --- /dev/null +++ b/nose/plugins/collect.py @@ -0,0 +1,93 @@ +""" +This plugin bypasses the actual execution of tests, instead just collecting +test names. Fixtures are also bypassed, so execution should be very quick. + +This plugin is useful in combination with the testid plugin (--with-id). Run +both together to get an indexed list of all tests that will enable you to run +individual tests by index number. + +This plugin is also useful for counting tests in a test suite, and making +people watching your demo think all of your tests pass. +""" +from nose.plugins.base import Plugin +from nose.case import Test +import logging +import unittest + +log = logging.getLogger(__name__) + + +class CollectOnly(Plugin): + """ + Collect and output test names only, don't run any tests. + """ + name = "collect-only" + enableOpt = 'collect_only' + + def options(self, parser, env): + """Register commandline options. + """ + parser.add_option('--collect-only', + action='store_true', + dest=self.enableOpt, + default=env.get('NOSE_COLLECT_ONLY'), + help="Enable collect-only: %s [COLLECT_ONLY]" % + (self.help())) + + def prepareTestLoader(self, loader): + """Install collect-only suite class in TestLoader. + """ + # Disable context awareness + log.debug("Preparing test loader") + loader.suiteClass = TestSuiteFactory(self.conf) + + def prepareTestCase(self, test): + """Replace actual test with dummy that always passes. + """ + # Return something that always passes + log.debug("Preparing test case %s", test) + if not isinstance(test, Test): + return + def run(result): + # We need to make these plugin calls because there won't be + # a result proxy, due to using a stripped-down test suite + self.conf.plugins.startTest(test) + result.startTest(test) + self.conf.plugins.addSuccess(test) + result.addSuccess(test) + self.conf.plugins.stopTest(test) + result.stopTest(test) + return run + + +class TestSuiteFactory: + """ + Factory for producing configured test suites. + """ + def __init__(self, conf): + self.conf = conf + + def __call__(self, tests=()): + return TestSuite(tests, conf=self.conf) + + +class TestSuite(unittest.TestSuite): + """ + Basic test suite that bypasses most proxy and plugin calls, but does + wrap tests in a nose.case.Test so prepareTestCase will be called. + """ + def __init__(self, tests=(), conf=None): + self.conf = conf + # Exec lazy suites: makes discovery depth-first + if callable(tests): + tests = tests() + log.debug("TestSuite(%r)", tests) + unittest.TestSuite.__init__(self, tests) + + def addTest(self, test): + log.debug("Add test %s", test) + if isinstance(test, unittest.TestSuite): + self._tests.append(test) + else: + self._tests.append(Test(test, config=self.conf)) + |