Merge pull request #78 from nicoddemus/env-vars
Add env variables to identify workers
This commit is contained in:
11
README.rst
11
README.rst
@@ -187,6 +187,8 @@ at once. The specifications strings use the `xspec syntax`_.
|
|||||||
|
|
||||||
Identifying the worker process during a test
|
Identifying the worker process during a test
|
||||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
|
||||||
If you need to determine the identity of a worker process in
|
If you need to determine the identity of a worker process in
|
||||||
a test or fixture, you may use the ``worker_id`` fixture to do so:
|
a test or fixture, you may use the ``worker_id`` fixture to do so:
|
||||||
|
|
||||||
@@ -200,6 +202,15 @@ a test or fixture, you may use the ``worker_id`` fixture to do so:
|
|||||||
When ``xdist`` is disabled (running with ``-n0`` for example), then
|
When ``xdist`` is disabled (running with ``-n0`` for example), then
|
||||||
``worker_id`` will return ``"master"``.
|
``worker_id`` will return ``"master"``.
|
||||||
|
|
||||||
|
Additionally, worker processes have the following environment variables
|
||||||
|
defined:
|
||||||
|
|
||||||
|
* ``PYTEST_XDIST_WORKER``: the name of the worker, e.g., ``"gw2"``.
|
||||||
|
* ``PYTEST_XDIST_WORKER_COUNT``: the total number of workers in this session,
|
||||||
|
e.g., ``"4"`` when ``-n 4`` is given in the command-line.
|
||||||
|
|
||||||
|
*New in version 1.15.*
|
||||||
|
|
||||||
Specifying test exec environments in an ini file
|
Specifying test exec environments in an ini file
|
||||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,12 @@ class SlaveSetup:
|
|||||||
self.gateway = execnet.makegateway()
|
self.gateway = execnet.makegateway()
|
||||||
self.config = config = self.testdir.parseconfigure()
|
self.config = config = self.testdir.parseconfigure()
|
||||||
putevent = self.use_callback and self.events.put or None
|
putevent = self.use_callback and self.events.put or None
|
||||||
self.slp = SlaveController(None, self.gateway, config, putevent)
|
|
||||||
|
class DummyMananger:
|
||||||
|
specs = [0, 1]
|
||||||
|
|
||||||
|
self.slp = SlaveController(DummyMananger, self.gateway, config,
|
||||||
|
putevent)
|
||||||
self.request.addfinalizer(self.slp.ensure_teardown)
|
self.request.addfinalizer(self.slp.ensure_teardown)
|
||||||
self.slp.setup()
|
self.slp.setup()
|
||||||
|
|
||||||
@@ -178,6 +183,8 @@ class TestSlaveInteractor:
|
|||||||
ev = slave.popevent("slavefinished")
|
ev = slave.popevent("slavefinished")
|
||||||
assert 'slaveoutput' in ev.kwargs
|
assert 'slaveoutput' in ev.kwargs
|
||||||
|
|
||||||
|
@pytest.mark.skipif(pytest.__version__ >= '3.0',
|
||||||
|
reason='skip at module level illegal in pytest 3.0')
|
||||||
def test_remote_collect_skip(self, slave):
|
def test_remote_collect_skip(self, slave):
|
||||||
slave.testdir.makepyfile("""
|
slave.testdir.makepyfile("""
|
||||||
import py
|
import py
|
||||||
@@ -255,3 +262,14 @@ class TestSlaveInteractor:
|
|||||||
("pytest_pycollect_makeitem", "name == 'test_func'"),
|
("pytest_pycollect_makeitem", "name == 'test_func'"),
|
||||||
("pytest_collectreport", "report.collector.fspath == bbb"),
|
("pytest_collectreport", "report.collector.fspath == bbb"),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def test_remote_env_vars(testdir):
|
||||||
|
testdir.makepyfile('''
|
||||||
|
import os
|
||||||
|
def test():
|
||||||
|
assert os.environ['PYTEST_XDIST_WORKER'] in ('gw0', 'gw1')
|
||||||
|
assert os.environ['PYTEST_XDIST_WORKER_COUNT'] == '2'
|
||||||
|
''')
|
||||||
|
result = testdir.runpytest('-n2', '--max-slave-restart=0')
|
||||||
|
assert result.ret == 0
|
||||||
|
|||||||
@@ -148,6 +148,8 @@ if __name__ == '__channelexec__':
|
|||||||
os.environ['PYTHONPATH'] = (
|
os.environ['PYTHONPATH'] = (
|
||||||
importpath + os.pathsep +
|
importpath + os.pathsep +
|
||||||
os.environ.get('PYTHONPATH', ''))
|
os.environ.get('PYTHONPATH', ''))
|
||||||
|
os.environ['PYTEST_XDIST_WORKER'] = slaveinput['slaveid']
|
||||||
|
os.environ['PYTEST_XDIST_WORKER_COUNT'] = str(slaveinput['slavecount'])
|
||||||
# os.environ['PYTHONPATH'] = importpath
|
# os.environ['PYTHONPATH'] = importpath
|
||||||
import py
|
import py
|
||||||
config = remote_initconfig(option_dict, args)
|
config = remote_initconfig(option_dict, args)
|
||||||
|
|||||||
@@ -205,7 +205,8 @@ class SlaveController(object):
|
|||||||
self.putevent = putevent
|
self.putevent = putevent
|
||||||
self.gateway = gateway
|
self.gateway = gateway
|
||||||
self.config = config
|
self.config = config
|
||||||
self.slaveinput = {'slaveid': gateway.id}
|
self.slaveinput = {'slaveid': gateway.id,
|
||||||
|
'slavecount': len(nodemanager.specs)}
|
||||||
self._down = False
|
self._down = False
|
||||||
self._shutdown_sent = False
|
self._shutdown_sent = False
|
||||||
self.log = py.log.Producer("slavectl-%s" % gateway.id)
|
self.log = py.log.Producer("slavectl-%s" % gateway.id)
|
||||||
|
|||||||
Reference in New Issue
Block a user