Skip to content

Commit

Permalink
pythongh-108388: Split test_multiprocessing_spawn (python#108396)
Browse files Browse the repository at this point in the history
Split test_multiprocessing_fork, test_multiprocessing_forkserver and
test_multiprocessing_spawn into test packages. Each package is made
of 4 sub-tests: processes, threads, manager and misc. It allows
running more tests in parallel and so reduce the total test duration.
  • Loading branch information
vstinner committed Aug 24, 2023
1 parent 174e9da commit aa9a359
Show file tree
Hide file tree
Showing 19 changed files with 117 additions and 27 deletions.
10 changes: 9 additions & 1 deletion Lib/test/_test_multiprocessing.py
Original file line number Diff line number Diff line change
Expand Up @@ -6126,7 +6126,8 @@ class ThreadsMixin(BaseMixin):
# Functions used to create test cases from the base ones in this module
#

def install_tests_in_module_dict(remote_globs, start_method):
def install_tests_in_module_dict(remote_globs, start_method,
only_type=None, exclude_types=False):
__module__ = remote_globs['__name__']
local_globs = globals()
ALL_TYPES = {'processes', 'threads', 'manager'}
Expand All @@ -6139,6 +6140,10 @@ def install_tests_in_module_dict(remote_globs, start_method):
continue
assert set(base.ALLOWED_TYPES) <= ALL_TYPES, base.ALLOWED_TYPES
for type_ in base.ALLOWED_TYPES:
if only_type and type_ != only_type:
continue
if exclude_types:
continue
newname = 'With' + type_.capitalize() + name[1:]
Mixin = local_globs[type_.capitalize() + 'Mixin']
class Temp(base, Mixin, unittest.TestCase):
Expand All @@ -6149,6 +6154,9 @@ class Temp(base, Mixin, unittest.TestCase):
Temp.__module__ = __module__
remote_globs[newname] = Temp
elif issubclass(base, unittest.TestCase):
if only_type:
continue

class Temp(base, object):
pass
Temp.__name__ = Temp.__qualname__ = name
Expand Down
3 changes: 3 additions & 0 deletions Lib/test/libregrtest/runtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,9 @@ def __str__(self) -> str:

SPLITTESTDIRS = {
"test_asyncio",
"test_multiprocessing_fork",
"test_multiprocessing_forkserver",
"test_multiprocessing_spawn",
}

# Storage of uncollectable objects
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import unittest
import test._test_multiprocessing

import os.path
import sys
import unittest
from test import support

if support.PGO:
Expand All @@ -13,7 +12,5 @@
if sys.platform == 'darwin':
raise unittest.SkipTest("test may crash on macOS (bpo-33725)")

test._test_multiprocessing.install_tests_in_module_dict(globals(), 'fork')

if __name__ == '__main__':
unittest.main()
def load_tests(*args):
return support.load_package_tests(os.path.dirname(__file__), *args)
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_fork/test_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'fork', only_type="manager")

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_fork/test_misc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'fork', exclude_types=True)

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_fork/test_processes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'fork', only_type="processes")

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_fork/test_threads.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'fork', only_type="threads")

if __name__ == '__main__':
unittest.main()
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import unittest
import test._test_multiprocessing

import os.path
import sys
import unittest
from test import support

if support.PGO:
Expand All @@ -10,7 +9,5 @@
if sys.platform == "win32":
raise unittest.SkipTest("forkserver is not available on Windows")

test._test_multiprocessing.install_tests_in_module_dict(globals(), 'forkserver')

if __name__ == '__main__':
unittest.main()
def load_tests(*args):
return support.load_package_tests(os.path.dirname(__file__), *args)
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_forkserver/test_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'forkserver', only_type="manager")

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_forkserver/test_misc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'forkserver', exclude_types=True)

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_forkserver/test_processes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'forkserver', only_type="processes")

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_forkserver/test_threads.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'forkserver', only_type="threads")

if __name__ == '__main__':
unittest.main()
12 changes: 0 additions & 12 deletions Lib/test/test_multiprocessing_spawn.py

This file was deleted.

9 changes: 9 additions & 0 deletions Lib/test/test_multiprocessing_spawn/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import os.path
import unittest
from test import support

if support.PGO:
raise unittest.SkipTest("test is not helpful for PGO")

def load_tests(*args):
return support.load_package_tests(os.path.dirname(__file__), *args)
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_spawn/test_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'spawn', only_type="manager")

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_spawn/test_misc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'spawn', exclude_types=True)

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_spawn/test_processes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'spawn', only_type="processes")

if __name__ == '__main__':
unittest.main()
7 changes: 7 additions & 0 deletions Lib/test/test_multiprocessing_spawn/test_threads.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import unittest
from test._test_multiprocessing import install_tests_in_module_dict

install_tests_in_module_dict(globals(), 'spawn', only_type="threads")

if __name__ == '__main__':
unittest.main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Split test_multiprocessing_fork, test_multiprocessing_forkserver and
test_multiprocessing_spawn into test packages. Each package is made of 4
sub-tests: processes, threads, manager and misc. It allows running more tests
in parallel and so reduce the total test duration. Patch by Victor Stinner.

0 comments on commit aa9a359

Please sign in to comment.