1717from .save_env import saved_test_environment
1818from .setup import setup_tests
1919from .testresult import get_test_runner
20+ from .parallel_case import ParallelTestCase
2021from .utils import (
2122 TestName ,
2223 clear_caches , remove_testfn , abs_module_name , print_warning )
2728PROGRESS_MIN_TIME = 30.0 # seconds
2829
2930
30- def run_unittest (test_mod ):
31+ def run_unittest (test_mod , runtests : RunTests ):
3132 loader = unittest .TestLoader ()
3233 tests = loader .loadTestsFromModule (test_mod )
34+
3335 for error in loader .errors :
3436 print (error , file = sys .stderr )
3537 if loader .errors :
3638 raise Exception ("errors while loading tests" )
3739 _filter_suite (tests , match_test )
40+ if runtests .parallel_threads :
41+ _parallelize_tests (tests , runtests .parallel_threads )
3842 return _run_suite (tests )
3943
4044def _filter_suite (suite , pred ):
@@ -49,6 +53,28 @@ def _filter_suite(suite, pred):
4953 newtests .append (test )
5054 suite ._tests = newtests
5155
56+ def _parallelize_tests (suite , parallel_threads : int ):
57+ def is_thread_unsafe (test ):
58+ test_method = getattr (test , test ._testMethodName )
59+ instance = test_method .__self__
60+ return (getattr (test_method , "__unittest_thread_unsafe__" , False ) or
61+ getattr (instance , "__unittest_thread_unsafe__" , False ))
62+
63+ newtests = []
64+ for test in suite ._tests :
65+ if isinstance (test , unittest .TestSuite ):
66+ _parallelize_tests (test , parallel_threads )
67+ newtests .append (test )
68+ continue
69+
70+ if is_thread_unsafe (test ):
71+ # Don't parallelize thread-unsafe tests
72+ newtests .append (test )
73+ continue
74+
75+ newtests .append (ParallelTestCase (test , parallel_threads ))
76+ suite ._tests = newtests
77+
5278def _run_suite (suite ):
5379 """Run tests from a unittest.TestSuite-derived class."""
5480 runner = get_test_runner (sys .stdout ,
@@ -133,7 +159,7 @@ def _load_run_test(result: TestResult, runtests: RunTests) -> None:
133159 raise Exception (f"Module { test_name } defines test_main() which "
134160 f"is no longer supported by regrtest" )
135161 def test_func ():
136- return run_unittest (test_mod )
162+ return run_unittest (test_mod , runtests )
137163
138164 try :
139165 regrtest_runner (result , test_func , runtests )
0 commit comments