-
-
Notifications
You must be signed in to change notification settings - Fork 32k
gh-119050: Add XML support to libregrtest refleak checker #119148
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file.
@Eclips4 @serhiy-storchaka: Would you mind to review my change? When tests are run in parallel, each process is run in its own temporary directory. The temporary XML file is simply created in the current working directory. There is no risk of overriding the file between two processes. |
Thanks Victor for writing this PR! I've tested it locally and it seems there's something wrong: ./python.exe -m test --junit-xml xml.out -R 3:3 -j 8
... Many lines
Traceback (most recent call last):
File "/Users/admin/Projects/cpython/Lib/runpy.py", line 198, in _run_module_as_main
return _run_code(code, main_globals, None,
"__main__", mod_spec)
File "/Users/admin/Projects/cpython/Lib/runpy.py", line 88, in _run_code
exec(code, run_globals)
~~~~^^^^^^^^^^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/__main__.py", line 2, in <module>
main(_add_python_opts=True)
~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/main.py", line 739, in main
Regrtest(ns, _add_python_opts=_add_python_opts).main(tests=tests)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/main.py", line 731, in main
exitcode = self.run_tests(selected, tests)
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/main.py", line 568, in run_tests
return self._run_tests(selected, tests)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/main.py", line 528, in _run_tests
self._run_tests_mp(runtests, self.num_workers)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/main.py", line 426, in _run_tests_mp
RunWorkers(num_workers, runtests, self.logger, self.results).run()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/run_workers.py", line 600, in run
result = self._process_result(item)
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/run_workers.py", line 571, in _process_result
self.results.accumulate_result(result, self.runtests)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/results.py", line 1
10000
32, in accumulate_result
self.add_junit(xml_data)
~~~~~~~~~~~~~~^^^^^^^^^^
File "/Users/admin/Projects/cpython/Lib/test/libregrtest/results.py", line 165, in add_junit
self.testsuite_xml.append(ET.fromstring(e))
~~~~~~~~~~~~~^^^
File "/Users/admin/Projects/cpython/Lib/xml/etree/ElementTree.py", line 1343, in XML
return parser.close()
~~~~~~~~~~~~^^
xml.etree.ElementTree.ParseError: no element found: line 1, column 5239 Full output: ./python.exe -m test --junit-xml out.xml -R 3:3 -j 8
== CPython 3.14.0a0 (heads/regrtest_xml:30ee2285ca, May 18 2024, 22:43:31) [Clang 15.0.0 (clang-1500.3.9.4)]
== macOS-14.5-arm64-arm-64bit-Mach-O little-endian
== Python build: debug
== cwd: /Users/admin/Projects/cpython/build/test_python_worker_21561æ
== CPU count: 8
== encodings: locale=UTF-8 FS=utf-8
== resources: all test resources are disabled, use -u option to unskip tests
Using random seed: 360681540
0:00:00 load avg: 5.52 Run 477 tests in parallel using 8 worker processes
0:00:00 load avg: 5.52 [ 1/477] test.test_asyncio.test_buffered_proto passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:00 load avg: 5.52 [ 2/477] test.test_asyncio.test_futures2 passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 ...
0:00:01 load avg: 5.52 [ 3/477] test.test_asyncio.test_context passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:01 load avg: 5.52 [ 4/477] test.test_asyncio.test_pep492 passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ..1
test.test_asyncio.test_pep492 leaked [0, 0, 1] memory blocks, sum=1 (this is fine)
0:00:02 load avg: 5.52 [ 5/477] test.test_asyncio.test_protocols passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:03 load avg: 5.52 [ 6/477] test.test_asyncio.test_proactor_events passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:04 load avg: 5.64 [ 7/477] test.test_asyncio.test_runners passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:06 load avg: 5.64 [ 8/477] test.test_asyncio.test_selector_events passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 ...
0:00:06 load avg: 5.64 [ 9/477] test.test_asyncio.test_queues passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:06 load avg: 5.64 [ 10/477] test.test_asyncio.test_eager_task_factory passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 .1.
test.test_asyncio.test_eager_task_factory leaked [-1, 1, -1] memory blocks, sum=-1 (this is fine)
0:00:09 load avg: 5.91 [ 11/477] test.test_asyncio.test_server passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:09 load avg: 5.91 [ 12/477] test.test_asyncio.test_locks passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:13 load avg: 5.91 [ 13/477] test.test_asyncio.test_base_events passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:15 load avg: 5.76 [ 14/477] test.test_asyncio.test_streams passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:18 load avg: 5.76 [ 15/477] test.test_asyncio.test_sendfile passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 ...
test.test_asyncio.test_sendfile leaked [0, 0, -1] memory blocks, sum=-1 (this is fine)
0:00:21 load avg: 5.38 [ 16/477] test.test_asyncio.test_futures passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:21 load avg: 5.38 [ 17/477] test.test_asyncio.test_threads passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 ...
0:00:23 load avg: 5.38 [ 18/477] test.test_asyncio.test_sock_lowlevel passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 ..1
test.test_asyncio.test_sock_lowlevel leaked [-1, 0, 1] memory blocks, sum=0 (this is fine)
0:00:23 load avg: 5.38 [ 19/477] test.test_asyncio.test_transports passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:24 load avg: 5.19 [ 20/477] test.test_asyncio.test_timeouts passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:28 load avg: 5.19 [ 21/477] test.test_asyncio.test_unix_events passed
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX2 ...
0:00:28 load avg: 5.19 [ 22/477] test.test_asyncio.test_windows_events skipped
test.test_asyncio.test_windows_events skipped -- Windows only
0:00:29 load avg: 5.01 [ 23/477] test.test_asyncio.test_windows_utils skipped
test.test_asyncio.test_windows_utils skipped -- Windows only
0:00:30 load avg: 5.01 [ 24/477] test.test_asyncio.test_waitfor passed -- running (1): test.test_asyncio.test_events (30.7 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:34 load avg: 4.69 [ 25/477] test.test_asyncio.test_sslproto passed -- running (1): test.test_asyncio.test_events (34.5 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX1 ...
0:00:49 load avg: 5.40 [ 26/477] test.test_asyncio.test_ssl passed (42.4 sec) -- running (4): test.test_asyncio.test_subprocess (36.0 sec), test.test_asyncio.test_tasks (30.9 sec), test.test_asyncio.test_events (49.3 sec), test.test_asyncio.test_taskgroups (34.0 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:52 load avg: 5.40 [ 27/477] test.test_asyncio.test_taskgroups passed (37.1 sec) -- running (3): test.test_asyncio.test_subprocess (39.1 sec), test.test_asyncio.test_tasks (34.0 sec), test.test_asyncio.test_events (52.4 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:00:53 load avg: 5.40 [ 28/477] test.test_concurrent_futures.test_future passed -- running (3): test.test_asyncio.test_subprocess (39.7 sec), test.test_asyncio.test_tasks (34.6 sec), test.test_asyncio.test_events (53.0 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ..1
test.test_concurrent_futures.test_future leaked [0, 0, 1] memory blocks, sum=1 (this is fine)
0:00:59 load avg: 6.38 [ 29/477] test.test_concurrent_futures.test_init passed -- running (4): test.test_asyncio.test_subprocess (45.9 sec), test.test_concurrent_futures.test_as_completed (30.1 sec), test.test_asyncio.test_tasks (40.8 sec), test.test_asyncio.test_events (59.2 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
/Users/admin/Projects/cpython/Lib/multiprocessing/resource_tracker.py:276: UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown: {'/mp-cxgv2mh2', '/mp-bmtx0jx_', '/mp-0cxkxijc', '/mp-9__vmdga', '/mp-ctcuaahn', '/mp-xssatz4s'}
warnings.warn(
X/Users/admin/Projects/cpython/Lib/multiprocessing/resource_tracker.py:276: UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown: {'/mp-s_enah44', '/mp-92ulzzud', '/mp-0fnfaqv4', '/mp-_hl3uzp0', '/mp-ywdk8v9k', '/mp-72k_lz88'}
warnings.warn(
X/Users/admin/Projects/cpython/Lib/multiprocessing/resource_tracker.py:276: UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown: {'/mp-0rtjl_xk', '/mp-q2tbv__y', '/mp-k3lx8xya', '/mp-hkvp6rl_', '/mp-y6k9n8u0', '/mp-oa7we0mx'}
warnings.warn(
./Users/admin/Projects/cpython/Lib/multiprocessing/resource_tracker.py:276: UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown: {'/mp-fte3vwka', '/mp-19nou5dh', '/mp-3heiifww', '/mp-v05j4urq', '/mp-05bvy6q7', '/mp-ol3d1zk1'}
warnings.warn(
1/Users/admin/Projects/cpython/Lib/multiprocessing/resource_tracker.py:276: UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown: {'/mp-ojy6xkih', '/mp-xef7sw_l', '/mp-m57s4dho', '/mp-huw80dz1', '/mp-es7s4o_w', '/mp-eqkb2w9q'}
warnings.warn(
2/Users/admin/Projects/cpython/Lib/multiprocessing/resource_tracker.py:276: UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown: {'/mp-51pdt_8k', '/mp-fvj1a4zb', '/mp-2y7_8yp0', '/mp-euv_kj0d', '/mp-szhgpu23', '/mp-7or6gaz1'}
warnings.warn(
.
test.test_concurrent_futures.test_init leaked [1, 2, 0] memory blocks, sum=3 (this is fine)
0:01:01 load avg: 6.38 [ 30/477] test.test_concurrent_futures.test_thread_pool passed -- running (5): test.test_asyncio.test_subprocess (48.4 sec), test.test_concurrent_futures.test_as_completed (32.7 sec), test.test_asyncio.test_tasks (43.3 sec), test.test_asyncio.test_events (1 min 1 sec), test.test_concurrent_futures.test_deadlock (31.0 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:05 load avg: 7.87 [ 31/477] test.test_asyncio.test_subprocess passed (52.2 sec) -- running (4): test.test_concurrent_futures.test_as_completed (36.5 sec), test.test_asyncio.test_tasks (47.2 sec), test.test_asyncio.test_events (1 min 5 sec), test.test_concurrent_futures.test_deadlock (34.9 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:06 load avg: 7.87 [ 32/477] test.test_future_stmt.test_future passed -- running (4): test.test_concurrent_futures.test_as_completed (37.5 sec), test.test_asyncio.test_tasks (48.2 sec), test.test_asyncio.test_events (1 min 6 sec), test.test_concurrent_futures.test_deadlock (35.9 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:06 load avg: 7.87 [ 33/477] test.test_future_stmt.test_future_flags passed -- running (4): test.test_concurrent_futures.test_as_completed (37.9 sec), test.test_asyncio.test_tasks (48.6 sec), test.test_asyncio.test_events (1 min 6 sec), test.test_concurrent_futures.test_deadlock (36.2 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:07 load avg: 7.87 [ 34/477] test.test_future_stmt.test_future_multiple_features passed -- running (4): test.test_concurrent_futures.test_as_completed (38.2 sec), test.test_asyncio.test_tasks (48.8 sec), test.test_asyncio.test_events (1 min 7 sec), test.test_concurrent_futures.test_deadlock (36.5 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:07 load avg: 7.87 [ 35/477] test.test_future_stmt.test_future_multiple_imports passed -- running (4): test.test_concurrent_futures.test_as_completed (38.5 sec), test.test_asyncio.test_tasks (49.2 sec), test.test_asyncio.test_events (1 min 7 sec), test.test_concurrent_futures.test_deadlock (36.9 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:07 load avg: 7.87 [ 36/477] test.test_future_stmt.test_future_single_import passed -- running (4): test.test_concurrent_futures.test_as_completed (38.8 sec), test.test_asyncio.test_tasks (49.5 sec), test.test_asyncio.test_events (1 min 7 sec), test.test_concurrent_futures.test_deadlock (37.1 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:07 load avg: 7.87 [ 37/477] test.test_gdb.test_backtrace skipped -- running (4): test.test_concurrent_futures.test_as_completed (38.9 sec), test.test_asyncio.test_tasks (49.6 sec), test.test_asyncio.test_events (1 min 7 sec), test.test_concurrent_futures.test_deadlock (37.3 sec)
test.test_gdb.test_backtrace skipped -- Couldn't find gdb program on the path: [Errno 2] No such file or directory: 'gdb'
0:01:08 load avg: 7.87 [ 38/477] test.test_gdb.test_cfunction skipped -- running (4): test.test_concurrent_futures.test_as_completed (39.1 sec), test.test_asyncio.test_tasks (49.7 sec), test.test_asyncio.test_events (1 min 8 sec), test.test_concurrent_futures.test_deadlock (37.4 sec)
test.test_gdb.test_cfunction skipped -- Couldn't find gdb program on the path: [Errno 2] No such file or directory: 'gdb'
0:01:08 load avg: 7.87 [ 39/477] test.test_gdb.test_cfunction_full skipped -- running (4): test.test_concurrent_futures.test_as_completed (39.3 sec), test.test_asyncio.test_tasks (50.0 sec), test.test_asyncio.test_events (1 min 8 sec), test.test_concurrent_futures.test_deadlock (37.7 sec)
test.test_gdb.test_cfunction_full skipped -- Couldn't find gdb program on the path: [Errno 2] No such file or directory: 'gdb'
0:01:08 load avg: 7.87 [ 40/477] test.test_gdb.test_misc skipped -- running (4): test.test_concurrent_futures.test_as_completed (39.5 sec), test.test_asyncio.test_tasks (50.1 sec), test.test_asyncio.test_events (1 min 8 sec), test.test_concurrent_futures.test_deadlock (37.8 sec)
test.test_gdb.test_misc skipped -- Couldn't find gdb program on the path: [Errno 2] No such file or directory: 'gdb'
0:01:08 load avg: 7.87 [ 41/477] test.test_gdb.test_pretty_print skipped -- running (4): test.test_concurrent_futures.test_as_completed (39.7 sec), test.test_asyncio.test_tasks (50.4 sec), test.test_asyncio.test_events (1 min 8 sec), test.test_concurrent_futures.test_deadlock (38.1 sec)
test.test_gdb.test_pretty_print skipped -- Couldn't find gdb program on the path: [Errno 2] No such file or directory: 'gdb'
0:01:17 load avg: 7.74 [ 42/477] test.test_inspect.test_inspect passed -- running (4): test.test_concurrent_futures.test_as_completed (48.9 sec), test.test_asyncio.test_tasks (59.6 sec), test.test_asyncio.test_events (1 min 17 sec), test.test_concurrent_futures.test_deadlock (47.3 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
X4. ..1
test.test_inspect.test_inspect leaked [0, 0, 1] memory blocks, sum=1 (this is fine)
0:01:18 load avg: 7.74 [ 43/477] test.test_multiprocessing_fork.test_manager skipped -- running (4): test.test_concurrent_futures.test_as_completed (49.0 sec), test.test_asyncio.test_tasks (59.7 sec), test.test_asyncio.test_events (1 min 18 sec), test.test_concurrent_futures.test_deadlock (47.4 sec)
test.test_multiprocessing_fork.test_manager skipped -- test may crash on macOS (bpo-33725)
0:01:18 load avg: 7.74 [ 44/477] test.test_multiprocessing_fork.test_misc skipped -- running (4): test.test_concurrent_futures.test_as_completed (49.2 sec), test.test_asyncio.test_tasks (59.9 sec), test.test_asyncio.test_events (1 min 18 sec), test.test_concurrent_futures.test_deadlock (47.5 sec)
test.test_multiprocessing_fork.test_misc skipped -- test may crash on macOS (bpo-33725)
0:01:18 load avg: 7.74 [ 45/477] test.test_multiprocessing_fork.test_processes skipped -- running (4): test.test_concurrent_futures.test_as_completed (49.3 sec), test.test_asyncio.test_tasks (1 min), test.test_asyncio.test_events (1 min 18 sec), test.test_concurrent_futures.test_deadlock (47.7 sec)
test.test_multiprocessing_fork.test_processes skipped -- test may crash on macOS (bpo-33725)
0:01:18 load avg: 7.74 [ 46/477] test.test_multiprocessing_fork.test_threads skipped -- running (4): test.test_concurrent_futures.test_as_completed (49.7 sec), test.test_asyncio.test_tasks (1 min), test.test_asyncio.test_events (1 min 18 sec), test.test_concurrent_futures.test_deadlock (48.0 sec)
test.test_multiprocessing_fork.test_threads skipped -- test may crash on macOS (bpo-33725)
0:01:35 load avg: 10.05 [ 47/477] test.test_concurrent_futures.test_process_pool passed (42.7 sec) -- running (6): test.test_concurrent_futures.test_as_completed (1 min 6 sec), test.test_asyncio.test_tasks (1 min 16 sec), test.test_concurrent_futures.test_wait (33.4 sec), test.test_asyncio.test_events (1 min 35 sec), test.test_concurrent_futures.test_deadlock (1 min 4 sec), test.test_concurrent_futures.test_shutdown (42.1 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. ...
0:01:55 load avg: 13.36 [ 48/477] test.test_asyncio.test_events passed (1 min 55 sec) -- running (6): test.test_multiprocessing_forkserver.test_manager (36.8 sec), test.test_concurrent_futures.test_as_completed (1 min 26 sec), test.test_asyncio.test_tasks (1 min 37 sec), test.test_concurrent_futures.test_wait (53.8 sec), test.test_concurrent_futures.test_deadlock (1 min 24 sec), test.test_concurrent_futures.test_shutdown (1 min 2 sec)
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
XX. .1.
test.test_asyncio.test_events leaked [0, 1, 0] memory blocks, sum |
Fixed by using pickle for serialization. My simple serialization using one XML item as text per line doesn't work since it can contain newline. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13. |
…onGH-119148) regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file. (cherry picked from commit 9257731) Co-authored-by: Victor Stinner <vstinner@python.org>
GH-119270 is a backport of this pull request to the 3.13 branch. |
Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.12. |
Sorry, @vstinner, I could not cleanly backport this to
|
GH-119272 is a backport of this pull request to the 3.12 branch. |
Merged, thanks for your review @Eclips4. |
…on#119148) regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file. (cherry picked from commit 9257731)
…119148) (#119270) gh-119050: Add XML support to libregrtest refleak checker (GH-119148) regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file. (cherry picked from commit 9257731) Co-authored-by: Victor Stinner <vstinner@python.org>
…9148) (#119272) gh-119050: Add XML support to libregrtest refleak checker (#119148) regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file. (cherry picked from commit 9257731)
…on#119148) regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file.
regrtest test runner: Add XML support to the refleak checker (-R option).
--duration
option to the test suite #119050