Fix handling of skipped modules with pytest.skip at module level
Fix #332
This commit is contained in:
1
changelog/332.bugfix.rst
Normal file
1
changelog/332.bugfix.rst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Fix report of module-level skips (``pytest.skip(reason, allow_module_level=True)``).
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import py
|
import py
|
||||||
import pprint
|
import pprint
|
||||||
import pytest
|
import pytest
|
||||||
|
from pkg_resources import parse_version
|
||||||
|
|
||||||
from xdist.workermanage import WorkerController, unserialize_report
|
from xdist.workermanage import WorkerController, unserialize_report
|
||||||
from xdist.remote import serialize_report
|
from xdist.remote import serialize_report
|
||||||
import execnet
|
import execnet
|
||||||
@@ -293,13 +295,14 @@ class TestWorkerInteractor:
|
|||||||
assert "workeroutput" in ev.kwargs
|
assert "workeroutput" in ev.kwargs
|
||||||
|
|
||||||
@pytest.mark.skipif(
|
@pytest.mark.skipif(
|
||||||
pytest.__version__ >= "3.0", reason="skip at module level illegal in pytest 3.0"
|
parse_version(pytest.__version__) < parse_version("3.3"),
|
||||||
|
reason="skip at module level illegal in this pytest version",
|
||||||
)
|
)
|
||||||
def test_remote_collect_skip(self, worker):
|
def test_remote_collect_skip(self, worker):
|
||||||
worker.testdir.makepyfile(
|
worker.testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import py
|
import pytest
|
||||||
py.test.skip("hello")
|
pytest.skip("hello", allow_module_level=True)
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
worker.setup()
|
worker.setup()
|
||||||
@@ -307,10 +310,9 @@ class TestWorkerInteractor:
|
|||||||
assert not ev.kwargs
|
assert not ev.kwargs
|
||||||
ev = worker.popevent()
|
ev = worker.popevent()
|
||||||
assert ev.name == "collectreport"
|
assert ev.name == "collectreport"
|
||||||
ev = worker.popevent()
|
|
||||||
assert ev.name == "collectreport"
|
|
||||||
rep = unserialize_report(ev.name, ev.kwargs["data"])
|
rep = unserialize_report(ev.name, ev.kwargs["data"])
|
||||||
assert rep.skipped
|
assert rep.skipped
|
||||||
|
assert rep.longrepr[2] == "Skipped: hello"
|
||||||
ev = worker.popevent("collectionfinish")
|
ev = worker.popevent("collectionfinish")
|
||||||
assert not ev.kwargs["ids"]
|
assert not ev.kwargs["ids"]
|
||||||
|
|
||||||
|
|||||||
@@ -259,10 +259,10 @@ class DSession(object):
|
|||||||
def worker_collectreport(self, node, rep):
|
def worker_collectreport(self, node, rep):
|
||||||
"""Emitted when a node calls the pytest_collectreport hook.
|
"""Emitted when a node calls the pytest_collectreport hook.
|
||||||
|
|
||||||
Because we only need the report when there's a failure, as optimization
|
Because we only need the report when there's a failure/skip, as optimization
|
||||||
we only expect to receive failed reports from workers (#330).
|
we only expect to receive failed/skipped reports from workers (#330).
|
||||||
"""
|
"""
|
||||||
assert rep.failed
|
assert not rep.passed
|
||||||
self._failed_worker_collectreport(node, rep)
|
self._failed_worker_collectreport(node, rep)
|
||||||
|
|
||||||
def worker_logwarning(self, message, code, nodeid, fslocation):
|
def worker_logwarning(self, message, code, nodeid, fslocation):
|
||||||
|
|||||||
@@ -110,8 +110,8 @@ class WorkerInteractor(object):
|
|||||||
self.sendevent("testreport", data=data)
|
self.sendevent("testreport", data=data)
|
||||||
|
|
||||||
def pytest_collectreport(self, report):
|
def pytest_collectreport(self, report):
|
||||||
# master only needs reports that failed, as optimization send only them instead (#330)
|
# send only reports that have not passed to master as optimization (#330)
|
||||||
if report.failed:
|
if not report.passed:
|
||||||
data = serialize_report(report)
|
data = serialize_report(report)
|
||||||
self.sendevent("collectreport", data=data)
|
self.sendevent("collectreport", data=data)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user