(micke, pedronis)
teach the resultlog plugin about the xfail tweaked outcomes --HG-- branch : trunk
This commit is contained in:
parent
81062c5e2f
commit
1b97d06a09
|
@ -14,7 +14,7 @@ def pytest_configure(config):
|
|||
resultlog = config.option.resultlog
|
||||
if resultlog:
|
||||
logfile = open(resultlog, 'w', 1) # line buffered
|
||||
config._resultlog = ResultLog(logfile)
|
||||
config._resultlog = ResultLog(config, logfile)
|
||||
config.pluginmanager.register(config._resultlog)
|
||||
|
||||
def pytest_unconfigure(config):
|
||||
|
@ -48,7 +48,8 @@ def generic_path(item):
|
|||
return ''.join(gpath)
|
||||
|
||||
class ResultLog(object):
|
||||
def __init__(self, logfile):
|
||||
def __init__(self, config, logfile):
|
||||
self.config = config
|
||||
self.logfile = logfile # preferably line buffered
|
||||
|
||||
def write_log_entry(self, testpath, shortrepr, longrepr):
|
||||
|
@ -61,8 +62,16 @@ class ResultLog(object):
|
|||
self.write_log_entry(testpath, shortrepr, longrepr)
|
||||
|
||||
def pytest_runtest_logreport(self, report):
|
||||
code = report.shortrepr
|
||||
if report.passed:
|
||||
res = self.config.hook.pytest_report_teststatus(report=report)
|
||||
if res is not None:
|
||||
code = res[1]
|
||||
else:
|
||||
code = report.shortrepr
|
||||
if code == 'x':
|
||||
longrepr = str(report.longrepr)
|
||||
elif code == 'P':
|
||||
longrepr = ''
|
||||
elif report.passed:
|
||||
longrepr = ""
|
||||
elif report.failed:
|
||||
longrepr = str(report.longrepr)
|
||||
|
|
|
@ -24,7 +24,7 @@ def test_generic_path():
|
|||
assert res == 'test/a:B().c[1]'
|
||||
|
||||
def test_write_log_entry():
|
||||
reslog = ResultLog(None)
|
||||
reslog = ResultLog(None, None)
|
||||
reslog.logfile = py.io.TextIO()
|
||||
reslog.write_log_entry('name', '.', '')
|
||||
entry = reslog.logfile.getvalue()
|
||||
|
@ -100,7 +100,13 @@ class TestWithFunctionIntegration:
|
|||
import py
|
||||
def test_pass(): pass
|
||||
def test_skip(): py.test.skip("hello")
|
||||
def test_fail(): raise ValueError("val")
|
||||
def test_fail(): raise ValueError("FAIL")
|
||||
|
||||
@py.test.mark.xfail
|
||||
def test_xfail(): raise ValueError("XFAIL")
|
||||
@py.test.mark.xfail
|
||||
def test_xpass(): pass
|
||||
|
||||
""")
|
||||
lines = self.getresultlog(testdir, mod)
|
||||
assert len(lines) >= 3
|
||||
|
@ -112,8 +118,15 @@ class TestWithFunctionIntegration:
|
|||
|
||||
assert lines[3].startswith("F ")
|
||||
assert lines[3].endswith("test_fail")
|
||||
tb = "".join(lines[4:])
|
||||
assert tb.find("ValueError") != -1
|
||||
tb = "".join(lines[4:8])
|
||||
assert tb.find('raise ValueError("FAIL")') != -1
|
||||
|
||||
assert lines[8].startswith('x ')
|
||||
tb = "".join(lines[8:14])
|
||||
assert tb.find('raise ValueError("XFAIL")') != -1
|
||||
|
||||
assert lines[14].startswith('P ')
|
||||
assert len(lines) == 15
|
||||
|
||||
def test_internal_exception(self):
|
||||
# they are produced for example by a teardown failing
|
||||
|
@ -122,7 +135,7 @@ class TestWithFunctionIntegration:
|
|||
raise ValueError
|
||||
except ValueError:
|
||||
excinfo = py.code.ExceptionInfo()
|
||||
reslog = ResultLog(py.io.TextIO())
|
||||
reslog = ResultLog(None, py.io.TextIO())
|
||||
reslog.pytest_internalerror(excinfo.getrepr())
|
||||
entry = reslog.logfile.getvalue()
|
||||
entry_lines = entry.splitlines()
|
||||
|
@ -142,6 +155,9 @@ def test_generic(testdir, LineMatcher):
|
|||
assert 0
|
||||
def test_skip():
|
||||
py.test.skip("")
|
||||
@py.test.mark.xfail
|
||||
def test_xfail():
|
||||
assert 0
|
||||
""")
|
||||
testdir.runpytest("--resultlog=result.log")
|
||||
lines = testdir.tmpdir.join("result.log").readlines(cr=0)
|
||||
|
@ -149,5 +165,6 @@ def test_generic(testdir, LineMatcher):
|
|||
". *:test_pass",
|
||||
"F *:test_fail",
|
||||
"s *:test_skip",
|
||||
"x *:test_xfail",
|
||||
])
|
||||
|
||||
|
|
Loading…
Reference in New Issue