Made it easier to customize the parallel test runner.

Subclass private APIs is marginally better than monkey-patching them,
even if it doesn't make a big difference in practice.
This commit is contained in:
Aymeric Augustin 2015-09-04 23:22:56 +02:00
parent 05cea7fdbb
commit 39bb66baad
1 changed files with 8 additions and 3 deletions

View File

@ -270,6 +270,10 @@ class ParallelTestSuite(unittest.TestSuite):
that they have been run in parallel. that they have been run in parallel.
""" """
# In case someone wants to modify these in a subclass.
init_worker = _init_worker
run_subsuite = _run_subsuite
def __init__(self, suite, processes, failfast=False): def __init__(self, suite, processes, failfast=False):
self.subsuites = partition_suite_by_case(suite) self.subsuites = partition_suite_by_case(suite)
self.processes = processes self.processes = processes
@ -297,13 +301,13 @@ class ParallelTestSuite(unittest.TestSuite):
counter = multiprocessing.Value(ctypes.c_int, 0) counter = multiprocessing.Value(ctypes.c_int, 0)
pool = multiprocessing.Pool( pool = multiprocessing.Pool(
processes=self.processes, processes=self.processes,
initializer=_init_worker, initializer=self.init_worker.__func__,
initargs=[counter]) initargs=[counter])
args = [ args = [
(index, subsuite, self.failfast) (index, subsuite, self.failfast)
for index, subsuite in enumerate(self.subsuites) for index, subsuite in enumerate(self.subsuites)
] ]
test_results = pool.imap_unordered(_run_subsuite, args) test_results = pool.imap_unordered(self.run_subsuite.__func__, args)
while True: while True:
if result.shouldStop: if result.shouldStop:
@ -339,6 +343,7 @@ class DiscoverRunner(object):
""" """
test_suite = unittest.TestSuite test_suite = unittest.TestSuite
parallel_test_suite = ParallelTestSuite
test_runner = unittest.TextTestRunner test_runner = unittest.TextTestRunner
test_loader = unittest.defaultTestLoader test_loader = unittest.defaultTestLoader
reorder_by = (TestCase, SimpleTestCase) reorder_by = (TestCase, SimpleTestCase)
@ -448,7 +453,7 @@ class DiscoverRunner(object):
suite = reorder_suite(suite, self.reorder_by, self.reverse) suite = reorder_suite(suite, self.reorder_by, self.reverse)
if self.parallel > 1: if self.parallel > 1:
suite = ParallelTestSuite(suite, self.parallel, self.failfast) suite = self.parallel_test_suite(suite, self.parallel, self.failfast)
return suite return suite