File tree 3 files changed +42
-7
lines changed
3 files changed +42
-7
lines changed Original file line number Diff line number Diff line change
1
+ from queue import Empty , Queue
2
+
1
3
import py
2
4
import pytest
3
5
4
- from xdist .workermanage import NodeManager
6
+ from xdist .remote import shared_key
5
7
from xdist .scheduler import (
6
8
EachScheduling ,
7
9
LoadScheduling ,
8
10
LoadScopeScheduling ,
9
11
LoadFileScheduling ,
10
12
LoadGroupScheduling ,
11
13
)
12
-
13
-
14
- from queue import Empty , Queue
14
+ from xdist .workermanage import NodeManager
15
15
16
16
17
17
class Interrupted (KeyboardInterrupt ):
@@ -174,6 +174,13 @@ def worker_workerfinished(self, node):
174
174
self .shouldstop = "{} received keyboard-interrupt" .format (node )
175
175
self .worker_errordown (node , "keyboard-interrupt" )
176
176
return
177
+ if "shared" in node .workeroutput :
178
+ shared = self .config .stash .setdefault (shared_key , {})
179
+ for key , value in node .workeroutput ["shared" ].items ():
180
+ if key in shared :
181
+ shared [key ].append (value )
182
+ else :
183
+ shared [key ] = [value ]
177
184
if node in self .sched .nodes :
178
185
crashitem = self .sched .remove_node (node )
179
186
assert not crashitem , (crashitem , node )
Original file line number Diff line number Diff line change 5
5
6
6
import py
7
7
import pytest
8
-
8
+ from _pytest . stash import StashKey
9
9
10
10
PYTEST_GTE_7 = hasattr (pytest , "version_tuple" ) and pytest .version_tuple >= (7 , 0 ) # type: ignore[attr-defined]
11
11
12
12
_sys_path = list (sys .path ) # freeze a copy of sys.path at interpreter startup
13
13
14
+ shared_key = StashKey ["str" ]()
15
+
14
16
15
17
@pytest .hookimpl
16
18
def pytest_xdist_auto_num_workers (config ):
@@ -302,3 +304,25 @@ def testrun_uid(request):
302
304
return request .config .workerinput ["testrunuid" ]
303
305
else :
304
306
return uuid .uuid4 ().hex
307
+
308
+
309
+ def get_shared_data (request_or_session ):
310
+ """Return shared data and True, if it is ran from xdist_controller"""
311
+ if is_xdist_controller (request_or_session ):
312
+ return request_or_session .config .stash .setdefault (shared_key , {}), True
313
+ return request_or_session .config .stash .setdefault (shared_key , {}), False
314
+
315
+
316
+ @pytest .fixture (scope = "session" )
317
+ def add_shared_data (request , worker_id ):
318
+ """Adds data that will be collected from all workers and be accessible from master node in sessionfinish hook"""
319
+
320
+ def _add (key , value ):
321
+ shared = request .config .stash .setdefault (shared_key , {})
322
+ if worker_id == "master" :
323
+ # Worker shared_data are grouped together, master data aren't
324
+ shared [key ] = [value ]
325
+ else :
326
+ shared [key ] = value
327
+
328
+ return _add
Original file line number Diff line number Diff line change 6
6
needs not to be installed in remote environments.
7
7
"""
8
8
9
- import sys
10
9
import os
10
+ import sys
11
11
import time
12
12
13
13
import py
14
14
import pytest
15
+ from _pytest .config import _prepareconfig , Config
15
16
from execnet .gateway_base import dumps , DumpError
16
17
17
- from _pytest . config import _prepareconfig , Config
18
+ from xdist . plugin import shared_key
18
19
19
20
try :
20
21
from setproctitle import setproctitle
@@ -64,6 +65,9 @@ def pytest_sessionstart(self, session):
64
65
def pytest_sessionfinish (self , exitstatus ):
65
66
# in pytest 5.0+, exitstatus is an IntEnum object
66
67
self .config .workeroutput ["exitstatus" ] = int (exitstatus )
68
+ shared = self .config .stash .get (shared_key , None )
69
+ if shared :
70
+ self .config .workeroutput ["shared" ] = shared
67
71
yield
68
72
self .sendevent ("workerfinished" , workeroutput = self .config .workeroutput )
69
73
You can’t perform that action at this time.
0 commit comments