blob: 4d5348f0c1811ebe6faddb7d978db204a0b669aa [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
Éric Araujoa963e0d2011-11-06 06:54:05 +010059 build = self.reinitialize_command('build')
Tarek Ziade1231a4e2011-05-19 13:07:25 +020060 self.run_command('build')
61 sys.path.insert(0, build.build_lib)
62
Éric Araujo4d155462011-11-15 11:43:20 +010063 # XXX maybe we could pass the verbose argument of pysetup here
Tarek Ziade1231a4e2011-05-19 13:07:25 +020064 logger = logging.getLogger('packaging')
65 verbose = logger.getEffectiveLevel() >= logging.DEBUG
66 verbosity = verbose + 1
67
68 # run the tests
69 if self.runner:
70 resolve_name(self.runner)()
71 elif self.suite:
72 runner = unittest.TextTestRunner(verbosity=verbosity)
73 runner.run(resolve_name(self.suite)())
74 elif self.get_ut_with_discovery():
75 ut = self.get_ut_with_discovery()
76 test_suite = ut.TestLoader().discover(os.curdir)
77 runner = ut.TextTestRunner(verbosity=verbosity)
78 runner.run(test_suite)
79 finally:
80 sys.path[:] = prev_syspath