Make xpass a failure again #11467
This commit is contained in:
parent
c52659458b
commit
115fb0d931
|
@ -0,0 +1 @@
|
||||||
|
In this strict parameter of xfail is set to true by default and it will ensure xpass is either a warning or a failure in any case.
|
|
@ -19,7 +19,6 @@ from _pytest.outcomes import fail
|
||||||
from _pytest.outcomes import skip
|
from _pytest.outcomes import skip
|
||||||
from _pytest.outcomes import xfail
|
from _pytest.outcomes import xfail
|
||||||
from _pytest.reports import BaseReport
|
from _pytest.reports import BaseReport
|
||||||
from _pytest.reports import TestReport
|
|
||||||
from _pytest.runner import CallInfo
|
from _pytest.runner import CallInfo
|
||||||
from _pytest.stash import StashKey
|
from _pytest.stash import StashKey
|
||||||
|
|
||||||
|
@ -208,7 +207,7 @@ def evaluate_xfail_marks(item: Item) -> Optional[Xfail]:
|
||||||
"""Evaluate xfail marks on item, returning Xfail if triggered."""
|
"""Evaluate xfail marks on item, returning Xfail if triggered."""
|
||||||
for mark in item.iter_markers(name="xfail"):
|
for mark in item.iter_markers(name="xfail"):
|
||||||
run = mark.kwargs.get("run", True)
|
run = mark.kwargs.get("run", True)
|
||||||
strict = mark.kwargs.get("strict", item.config.getini("xfail_strict"))
|
strict = mark.kwargs.get(item.config.getini("xfail_strict"), True)
|
||||||
raises = mark.kwargs.get("raises", None)
|
raises = mark.kwargs.get("raises", None)
|
||||||
if "condition" not in mark.kwargs:
|
if "condition" not in mark.kwargs:
|
||||||
conditions = mark.args
|
conditions = mark.args
|
||||||
|
@ -244,7 +243,7 @@ def pytest_runtest_setup(item: Item) -> None:
|
||||||
xfail("[NOTRUN] " + xfailed.reason)
|
xfail("[NOTRUN] " + xfailed.reason)
|
||||||
|
|
||||||
|
|
||||||
@hookimpl(wrapper=True)
|
@hookimpl(hookwrapper=True)
|
||||||
def pytest_runtest_call(item: Item) -> Generator[None, None, None]:
|
def pytest_runtest_call(item: Item) -> Generator[None, None, None]:
|
||||||
xfailed = item.stash.get(xfailed_key, None)
|
xfailed = item.stash.get(xfailed_key, None)
|
||||||
if xfailed is None:
|
if xfailed is None:
|
||||||
|
@ -253,20 +252,18 @@ def pytest_runtest_call(item: Item) -> Generator[None, None, None]:
|
||||||
if xfailed and not item.config.option.runxfail and not xfailed.run:
|
if xfailed and not item.config.option.runxfail and not xfailed.run:
|
||||||
xfail("[NOTRUN] " + xfailed.reason)
|
xfail("[NOTRUN] " + xfailed.reason)
|
||||||
|
|
||||||
try:
|
yield
|
||||||
return (yield)
|
|
||||||
finally:
|
|
||||||
# The test run may have added an xfail mark dynamically.
|
# The test run may have added an xfail mark dynamically.
|
||||||
xfailed = item.stash.get(xfailed_key, None)
|
xfailed = item.stash.get(xfailed_key, None)
|
||||||
if xfailed is None:
|
if xfailed is None:
|
||||||
item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item)
|
item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item)
|
||||||
|
|
||||||
|
|
||||||
@hookimpl(wrapper=True)
|
@hookimpl(hookwrapper=True)
|
||||||
def pytest_runtest_makereport(
|
def pytest_runtest_makereport(item: Item, call: CallInfo[None]):
|
||||||
item: Item, call: CallInfo[None]
|
outcome = yield
|
||||||
) -> Generator[None, TestReport, TestReport]:
|
rep = outcome.get_result()
|
||||||
rep = yield
|
|
||||||
xfailed = item.stash.get(xfailed_key, None)
|
xfailed = item.stash.get(xfailed_key, None)
|
||||||
if item.config.option.runxfail:
|
if item.config.option.runxfail:
|
||||||
pass # don't interfere
|
pass # don't interfere
|
||||||
|
@ -289,7 +286,6 @@ def pytest_runtest_makereport(
|
||||||
else:
|
else:
|
||||||
rep.outcome = "passed"
|
rep.outcome = "passed"
|
||||||
rep.wasxfail = xfailed.reason
|
rep.wasxfail = xfailed.reason
|
||||||
return rep
|
|
||||||
|
|
||||||
|
|
||||||
def pytest_report_teststatus(report: BaseReport) -> Optional[Tuple[str, str, str]]:
|
def pytest_report_teststatus(report: BaseReport) -> Optional[Tuple[str, str, str]]:
|
||||||
|
|
|
@ -357,6 +357,22 @@ class TestXFail:
|
||||||
assert str(callreport.longrepr) == "[XPASS(strict)] nope"
|
assert str(callreport.longrepr) == "[XPASS(strict)] nope"
|
||||||
assert not hasattr(callreport, "wasxfail")
|
assert not hasattr(callreport, "wasxfail")
|
||||||
|
|
||||||
|
def test_xfail_xpassed_strict_default_true(self, pytester: Pytester) -> None:
|
||||||
|
item = pytester.getitem(
|
||||||
|
"""
|
||||||
|
import pytest
|
||||||
|
@pytest.mark.xfail
|
||||||
|
def test_func():
|
||||||
|
assert 1
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
reports = runtestprotocol(item, log=False)
|
||||||
|
assert len(reports) == 3
|
||||||
|
callreport = reports[1]
|
||||||
|
assert callreport.failed
|
||||||
|
assert str(callreport.longrepr) == "[XPASS(strict)] nope"
|
||||||
|
assert not hasattr(callreport, "wasxfail")
|
||||||
|
|
||||||
def test_xfail_run_anyway(self, pytester: Pytester) -> None:
|
def test_xfail_run_anyway(self, pytester: Pytester) -> None:
|
||||||
pytester.makepyfile(
|
pytester.makepyfile(
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue