blob: 7f9015bc8ec6d813fc3c4d5256ae919cf103b36d [file] [log] [blame]
Tarek Ziade1231a4e2011-05-19 13:07:25 +02001"""Run the project's test suite."""
2
3import os
4import sys
5import logging
6import unittest
7
8from packaging import logger
9from packaging.command.cmd import Command
10from packaging.database import get_distribution
11from packaging.errors import PackagingOptionError
12from packaging.util import resolve_name
13
14
15class test(Command):
16
17 description = "run the project's test suite"
18
19 user_options = [
20 ('suite=', 's',
21 "test suite to run (for example: 'some_module.test_suite')"),
22 ('runner=', None,
23 "test runner to be called."),
24 ('tests-require=', None,
25 "list of distributions required to run the test suite."),
26 ]
27
28 def initialize_options(self):
29 self.suite = None
30 self.runner = None
31 self.tests_require = []
32
33 def finalize_options(self):
34 self.build_lib = self.get_finalized_command("build").build_lib
35 for requirement in self.tests_require:
36 if get_distribution(requirement) is None:
37 logger.warning("test dependency %s is not installed, "
38 "tests may fail", requirement)
39 if (not self.suite and not self.runner and
40 self.get_ut_with_discovery() is None):
41 raise PackagingOptionError(
42 "no test discovery available, please give a 'suite' or "
43 "'runner' option or install unittest2")
44
45 def get_ut_with_discovery(self):
46 if hasattr(unittest.TestLoader, "discover"):
47 return unittest
48 else:
49 try:
50 import unittest2
51 return unittest2
52 except ImportError:
53 return None
54
55 def run(self):
56 prev_syspath = sys.path[:]
57 try:
58 # build release
59 build = self.get_reinitialized_command('build')
60 self.run_command('build')
61 sys.path.insert(0, build.build_lib)
62
63 # Temporary kludge until we remove the verbose arguments and use
64 # logging everywhere
65 logger = logging.getLogger('packaging')
66 verbose = logger.getEffectiveLevel() >= logging.DEBUG
67 verbosity = verbose + 1
68
69 # run the tests
70 if self.runner:
71 resolve_name(self.runner)()
72 elif self.suite:
73 runner = unittest.TextTestRunner(verbosity=verbosity)
74 runner.run(resolve_name(self.suite)())
75 elif self.get_ut_with_discovery():
76 ut = self.get_ut_with_discovery()
77 test_suite = ut.TestLoader().discover(os.curdir)
78 runner = ut.TextTestRunner(verbosity=verbosity)
79 runner.run(test_suite)
80 finally:
81 sys.path[:] = prev_syspath