cpython/Lib/packaging/command/test.py

82 lines
2.7 KiB
Python
Raw Normal View History

"""Run the project's test suite."""
import os
import sys
import logging
import unittest
from packaging import logger
from packaging.command.cmd import Command
from packaging.database import get_distribution
from packaging.errors import PackagingOptionError
from packaging.util import resolve_name
class test(Command):
description = "run the project's test suite"
user_options = [
('suite=', 's',
"test suite to run (for example: 'some_module.test_suite')"),
('runner=', None,
"test runner to be called."),
('tests-require=', None,
"list of distributions required to run the test suite."),
]
def initialize_options(self):
self.suite = None
self.runner = None
self.tests_require = []
def finalize_options(self):
self.build_lib = self.get_finalized_command("build").build_lib
for requirement in self.tests_require:
if get_distribution(requirement) is None:
logger.warning("test dependency %s is not installed, "
"tests may fail", requirement)
if (not self.suite and not self.runner and
self.get_ut_with_discovery() is None):
raise PackagingOptionError(
"no test discovery available, please give a 'suite' or "
"'runner' option or install unittest2")
def get_ut_with_discovery(self):
if hasattr(unittest.TestLoader, "discover"):
return unittest
else:
try:
import unittest2
return unittest2
except ImportError:
return None
def run(self):
prev_syspath = sys.path[:]
try:
# build release
build = self.get_reinitialized_command('build')
self.run_command('build')
sys.path.insert(0, build.build_lib)
# Temporary kludge until we remove the verbose arguments and use
# logging everywhere
logger = logging.getLogger('packaging')
verbose = logger.getEffectiveLevel() >= logging.DEBUG
verbosity = verbose + 1
# run the tests
if self.runner:
resolve_name(self.runner)()
elif self.suite:
runner = unittest.TextTestRunner(verbosity=verbosity)
runner.run(resolve_name(self.suite)())
elif self.get_ut_with_discovery():
ut = self.get_ut_with_discovery()
test_suite = ut.TestLoader().discover(os.curdir)
runner = ut.TextTestRunner(verbosity=verbosity)
runner.run(test_suite)
finally:
sys.path[:] = prev_syspath