Fix handling of skipped modules with pytest.skip at module level

Fix #332
This commit is contained in:
Bruno Oliveira
2018-11-10 14:14:04 -02:00
parent d40d47acd9
commit 3292e0ede0
4 changed files with 13 additions and 10 deletions

1
changelog/332.bugfix.rst Normal file
View File

@@ -0,0 +1 @@
Fix report of module-level skips (``pytest.skip(reason, allow_module_level=True)``).

View File

@@ -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"]

View File

@@ -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):

View File

@@ -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)