Implement a hacky first pass at discovery.
[third_party/subunit] / python / subunit / run.py
1 #!/usr/bin/python
2 #
3 # Simple subunit testrunner for python
4 # Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
5 #   
6 #  Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
7 #  license at the users choice. A copy of both licenses are available in the
8 #  project source as Apache-2.0 and BSD. You may not use this file except in
9 #  compliance with one of these two licences.
10 #  
11 #  Unless required by applicable law or agreed to in writing, software
12 #  distributed under these licenses is distributed on an "AS IS" BASIS, WITHOUT
13 #  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
14 #  license you chose for the specific language governing permissions and
15 #  limitations under that license.
16 #
17
18 """Run a unittest testcase reporting results as Subunit.
19
20   $ python -m subunit.run mylib.tests.test_suite
21 """
22
23 import sys
24
25 from subunit import TestProtocolClient, get_default_formatter
26
27 try:
28     import discover
29     has_discover = True
30 except ImportError:
31     has_discover = False
32
33
34 class SubunitTestRunner(object):
35     def __init__(self, stream=sys.stdout):
36         self.stream = stream
37
38     def run(self, test):
39         "Run the given test case or test suite."
40         result = TestProtocolClient(self.stream)
41         test(result)
42         return result
43
44
45 if __name__ == '__main__':
46     import optparse
47     from unittest import TestProgram, TestSuite
48     parser = optparse.OptionParser(__doc__)
49     if has_discover:
50         parser.add_option("--discover", dest="discover", action="store_true",
51                 help="Use test discovery on the given testspec.")
52     options, args = parser.parse_args()
53     stream = get_default_formatter()
54     runner = SubunitTestRunner(stream)
55     if has_discover and options.discover:
56         loader = discover.DiscoveringTestLoader()
57         test = TestSuite()
58         for arg in args:
59             test.addTest(loader.discover(arg))
60         result = runner.run(test)
61         sys.exit(not result.wasSuccessful())
62     program = TestProgram(module=None, argv=[sys.argv[0]] + args,
63                           testRunner=runner)