new --runxfail option to ignore xfail markers on functions

--HG--
branch : trunk
This commit is contained in:
holger krekel 2010-05-04 13:02:27 +02:00
parent 28150c7486
commit c933ada7fb
3 changed files with 30 additions and 7 deletions

View File

@ -14,9 +14,10 @@ Changes between 1.2.1 and 1.3.0 (release pending)
- new pytest_pycollect_makemodule(path, parent) hook for - new pytest_pycollect_makemodule(path, parent) hook for
allowing customization of the Module collection object for a allowing customization of the Module collection object for a
matching test module. matching test module.
- extend py.test.mark.xfail to accept two more keyword arg parameters: - extend and refine xfail mechanism:
``xfail(run=False)`` will not run the decorated test ``@py.test.mark.xfail(run=False)`` do not run the decorated test
``xfail(reason="...")`` will print the reason string when reporting ``@py.test.mark.xfail(reason="...")`` prints the reason string in xfail summaries
specifiying ``--runxfail`` on command line virtually ignores xfail markers
- expose (previously internal) commonly useful methods: - expose (previously internal) commonly useful methods:
py.io.get_terminal_with() -> return terminal width py.io.get_terminal_with() -> return terminal width
py.io.ansi_print(...) -> print colored/bold text on linux/win32 py.io.ansi_print(...) -> print colored/bold text on linux/win32

View File

@ -126,6 +126,12 @@ within test or setup code. Example::
import py import py
def pytest_addoption(parser):
group = parser.getgroup("general")
group.addoption('--runxfail',
action="store_true", dest="runxfail", default=False,
help="run tests even if they are marked xfail")
class MarkEvaluator: class MarkEvaluator:
def __init__(self, item, name): def __init__(self, item, name):
self.item = item self.item = item
@ -172,6 +178,7 @@ def pytest_runtest_setup(item):
if evalskip.istrue(): if evalskip.istrue():
py.test.skip(evalskip.getexplanation()) py.test.skip(evalskip.getexplanation())
item._evalxfail = MarkEvaluator(item, 'xfail') item._evalxfail = MarkEvaluator(item, 'xfail')
if not item.config.getvalue("runxfail"):
if item._evalxfail.istrue(): if item._evalxfail.istrue():
if not item._evalxfail.get('run', True): if not item._evalxfail.get('run', True):
py.test.skip("xfail") py.test.skip("xfail")
@ -192,7 +199,7 @@ def pytest_runtest_makereport(__multicall__, item, call):
return rep return rep
elif call.when == "call": elif call.when == "call":
rep = __multicall__.execute() rep = __multicall__.execute()
if evalxfail.istrue(): if not item.config.getvalue("runxfail") and evalxfail.istrue():
if call.excinfo: if call.excinfo:
rep.skipped = True rep.skipped = True
rep.failed = rep.passed = False rep.failed = rep.passed = False

View File

@ -96,6 +96,21 @@ class TestXFail:
expl = callreport.keywords['xfail'] expl = callreport.keywords['xfail']
assert expl == "condition: True" assert expl == "condition: True"
def test_xfail_run_anyway(self, testdir):
testdir.makepyfile("""
import py
@py.test.mark.xfail
def test_func():
assert 0
""")
result = testdir.runpytest("--runxfail")
assert result.ret == 1
result.stdout.fnmatch_lines([
"*def test_func():*",
"*assert 0*",
"*1 failed*",
])
def test_xfail_evalfalse_but_fails(self, testdir): def test_xfail_evalfalse_but_fails(self, testdir):
item = testdir.getitem(""" item = testdir.getitem("""
import py import py