[svn r63630] some more code to prepare for substituting the
fixture/runtest code, using more plugins. --HG-- branch : trunk
This commit is contained in:
parent
ba6eca8da4
commit
b2077ed2ec
|
@ -10,5 +10,5 @@ Generator = py.test.collect.Generator
|
||||||
Function = py.test.collect.Function
|
Function = py.test.collect.Function
|
||||||
Instance = py.test.collect.Instance
|
Instance = py.test.collect.Instance
|
||||||
|
|
||||||
pytest_plugins = "default terminal xfail tmpdir execnetcleanup monkeypatch".split()
|
pytest_plugins = "default terminal xfail tmpdir execnetcleanup monkeypatch pdb".split()
|
||||||
|
|
||||||
|
|
|
@ -85,9 +85,12 @@ class Events:
|
||||||
def pyevent__itemtestreport(self, event):
|
def pyevent__itemtestreport(self, event):
|
||||||
""" test has been run. """
|
""" test has been run. """
|
||||||
|
|
||||||
def pyevent__itemsetupreport(self, rep):
|
def pyevent__item_runtest_finished(self, item, excinfo, outerr):
|
||||||
""" test has been run. """
|
""" test has been run. """
|
||||||
|
|
||||||
|
def pyevent__itemsetupreport(self, rep):
|
||||||
|
""" a report on running a fixture function. """
|
||||||
|
|
||||||
def pyevent__deselected(self, items):
|
def pyevent__deselected(self, items):
|
||||||
""" collected items that were deselected (by keyword). """
|
""" collected items that were deselected (by keyword). """
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,11 @@ class DefaultPlugin:
|
||||||
from py.__.test import runner
|
from py.__.test import runner
|
||||||
return runner.ItemTestReport(item, excinfo, when, outerr)
|
return runner.ItemTestReport(item, excinfo, when, outerr)
|
||||||
|
|
||||||
|
def pyevent__item_runtest_finished(self, item, excinfo, outerr):
|
||||||
|
from py.__.test import runner
|
||||||
|
rep = runner.ItemTestReport(item, excinfo, "execute", outerr)
|
||||||
|
item.config.pytestplugins.notify("itemtestreport", rep)
|
||||||
|
|
||||||
def pytest_pyfunc_call(self, pyfuncitem, args, kwargs):
|
def pytest_pyfunc_call(self, pyfuncitem, args, kwargs):
|
||||||
pyfuncitem.obj(*args, **kwargs)
|
pyfuncitem.obj(*args, **kwargs)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
from py.__.test.custompdb import post_mortem
|
||||||
|
|
||||||
|
class PdbPlugin:
|
||||||
|
def pytest_item_runtest_finished(self, item, excinfo, outerr):
|
||||||
|
if excinfo and item.config.option.usepdb:
|
||||||
|
tw = py.io.TerminalWriter()
|
||||||
|
repr = excinfo.getrepr()
|
||||||
|
repr.toterminal(tw)
|
||||||
|
post_mortem(excinfo._excinfo[2])
|
|
@ -166,7 +166,6 @@ class CollectionReport(BaseReport):
|
||||||
class ItemSetupReport(BaseReport):
|
class ItemSetupReport(BaseReport):
|
||||||
""" Test Execution Report. """
|
""" Test Execution Report. """
|
||||||
failed = passed = skipped = False
|
failed = passed = skipped = False
|
||||||
|
|
||||||
def __init__(self, item, excinfo=None, outerr=None):
|
def __init__(self, item, excinfo=None, outerr=None):
|
||||||
self.item = item
|
self.item = item
|
||||||
self.outerr = outerr
|
self.outerr = outerr
|
||||||
|
@ -177,7 +176,7 @@ class ItemSetupReport(BaseReport):
|
||||||
self.skipped = True
|
self.skipped = True
|
||||||
else:
|
else:
|
||||||
self.failed = True
|
self.failed = True
|
||||||
self.excrepr = item._repr_failure_py(excinfo, outerr)
|
self.excrepr = item._repr_failure_py(excinfo, [])
|
||||||
|
|
||||||
class SetupState(object):
|
class SetupState(object):
|
||||||
""" shared state for setting up/tearing down test items or collectors. """
|
""" shared state for setting up/tearing down test items or collectors. """
|
||||||
|
@ -207,26 +206,42 @@ class SetupState(object):
|
||||||
col.setup()
|
col.setup()
|
||||||
self.stack.append(col)
|
self.stack.append(col)
|
||||||
|
|
||||||
def fixturecall(self, callable, item):
|
def do_setup(self, item):
|
||||||
excinfo = None
|
excinfo, outerr = guarded_call(item.config._getcapture(),
|
||||||
capture = item.config._getcapture()
|
lambda: self.prepare(item)
|
||||||
try:
|
)
|
||||||
try:
|
rep = ItemSetupReport(item, excinfo, outerr)
|
||||||
callable(item)
|
item.config.pytestplugins.notify("itemsetupreport", rep)
|
||||||
except (KeyboardInterrupt, SystemExit):
|
return not excinfo
|
||||||
raise
|
|
||||||
except:
|
def do_teardown(self, item):
|
||||||
excinfo = py.code.ExceptionInfo()
|
excinfo, outerr = guarded_call(item.config._getcapture(),
|
||||||
finally:
|
lambda: self.teardown_exact(item)
|
||||||
outerr = capture.reset()
|
)
|
||||||
if not excinfo:
|
if excinfo:
|
||||||
return True
|
|
||||||
else:
|
|
||||||
rep = ItemSetupReport(item, excinfo, outerr)
|
rep = ItemSetupReport(item, excinfo, outerr)
|
||||||
item.config.pytestplugins.notify("itemsetupreport", rep)
|
item.config.pytestplugins.notify("itemsetupreport", rep)
|
||||||
|
|
||||||
def setupitem(self, item):
|
def do_fixture_and_runtest(self, item):
|
||||||
return self.fixturecall(self.prepare, item)
|
""" setup fixture and perform actual item.runtest(). """
|
||||||
|
if self.do_setup(item):
|
||||||
|
excinfo, outerr = guarded_call(item.config._getcapture(),
|
||||||
|
lambda: item.runtest())
|
||||||
|
item.config.pytestplugins.notify(
|
||||||
|
"item_runtest_finished",
|
||||||
|
item=item, excinfo=excinfo, outerr=outerr)
|
||||||
|
self.do_teardown(item)
|
||||||
|
|
||||||
|
def guarded_call(capture, call):
|
||||||
|
excinfo = None
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
call()
|
||||||
|
except (KeyboardInterrupt, Exit):
|
||||||
|
raise
|
||||||
|
except:
|
||||||
|
excinfo = py.code.ExceptionInfo()
|
||||||
|
finally:
|
||||||
|
outerr = capture.reset()
|
||||||
|
return excinfo, outerr
|
||||||
|
|
||||||
def teardownitem(self, item):
|
|
||||||
self.fixturecall(self.teardown_exact, item)
|
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
|
||||||
|
from py.__.test.config import SetupState
|
||||||
|
|
||||||
|
class TestSetupState:
|
||||||
|
def test_setup_ok(self, testdir):
|
||||||
|
item = testdir.getitem("""
|
||||||
|
def setup_module(mod):
|
||||||
|
pass
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
evrec = testdir.geteventrecorder(item.config)
|
||||||
|
setup = SetupState()
|
||||||
|
res = setup.do_setup(item)
|
||||||
|
assert res
|
||||||
|
|
||||||
|
def test_setup_fails(self, testdir):
|
||||||
|
item = testdir.getitem("""
|
||||||
|
def setup_module(mod):
|
||||||
|
print "world"
|
||||||
|
raise ValueError(42)
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
evrec = testdir.geteventrecorder(item.config)
|
||||||
|
setup = SetupState()
|
||||||
|
res = setup.do_setup(item)
|
||||||
|
assert not res
|
||||||
|
rep = evrec.popevent("itemsetupreport").rep
|
||||||
|
assert rep.failed
|
||||||
|
assert not rep.skipped
|
||||||
|
assert rep.excrepr
|
||||||
|
assert "42" in str(rep.excrepr)
|
||||||
|
assert rep.outerr[0].find("world") != -1
|
||||||
|
|
||||||
|
def test_teardown_fails(self, testdir):
|
||||||
|
item = testdir.getitem("""
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
def teardown_function(func):
|
||||||
|
print "13"
|
||||||
|
raise ValueError(25)
|
||||||
|
""")
|
||||||
|
evrec = testdir.geteventrecorder(item.config)
|
||||||
|
setup = SetupState()
|
||||||
|
res = setup.do_setup(item)
|
||||||
|
assert res
|
||||||
|
rep = evrec.popevent("itemsetupreport").rep
|
||||||
|
assert rep.passed
|
||||||
|
setup.do_teardown(item)
|
||||||
|
rep = evrec.popevent("itemsetupreport").rep
|
||||||
|
assert rep.item == item
|
||||||
|
assert rep.failed
|
||||||
|
assert not rep.passed
|
||||||
|
assert "13" in rep.outerr[0]
|
||||||
|
assert "25" in str(rep.excrepr)
|
||||||
|
|
||||||
|
def test_setupitem_skips(self, testdir):
|
||||||
|
item = testdir.getitem("""
|
||||||
|
import py
|
||||||
|
def setup_module(mod):
|
||||||
|
py.test.skip("17")
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
evrec = testdir.geteventrecorder(item.config)
|
||||||
|
setup = SetupState()
|
||||||
|
setup.do_setup(item)
|
||||||
|
rep = evrec.popevent("itemsetupreport").rep
|
||||||
|
assert not rep.failed
|
||||||
|
assert rep.skipped
|
||||||
|
assert rep.excrepr
|
||||||
|
assert "17" in str(rep.excrepr)
|
||||||
|
|
||||||
|
def test_runtest_ok(self, testdir):
|
||||||
|
item = testdir.getitem("def test_func(): pass")
|
||||||
|
evrec = testdir.geteventrecorder(item.config)
|
||||||
|
setup = SetupState()
|
||||||
|
setup.do_fixture_and_runtest(item)
|
||||||
|
rep = evrec.popevent("itemtestreport").event
|
||||||
|
assert rep.passed
|
||||||
|
|
||||||
|
def test_runtest_fails(self, testdir):
|
||||||
|
item = testdir.getitem("def test_func(): assert 0")
|
||||||
|
evrec = testdir.geteventrecorder(item.config)
|
||||||
|
setup = SetupState()
|
||||||
|
setup.do_fixture_and_runtest(item)
|
||||||
|
event = evrec.popevent("item_runtest_finished")
|
||||||
|
assert event.excinfo
|
||||||
|
|
||||||
|
|
|
@ -139,73 +139,3 @@ def test_method_setup_uses_fresh_instances(testdir):
|
||||||
""")
|
""")
|
||||||
sorter.assertoutcome(passed=4, failed=0)
|
sorter.assertoutcome(passed=4, failed=0)
|
||||||
|
|
||||||
from py.__.test.config import SetupState
|
|
||||||
|
|
||||||
class TestSetupState:
|
|
||||||
def test_setupitem_works(self, testdir):
|
|
||||||
item = testdir.getitem("""
|
|
||||||
def setup_module(mod):
|
|
||||||
pass
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
""")
|
|
||||||
evrec = testdir.geteventrecorder(item.config)
|
|
||||||
setup = SetupState()
|
|
||||||
res = setup.setupitem(item)
|
|
||||||
assert res
|
|
||||||
|
|
||||||
def test_setupitem_fails(self, testdir):
|
|
||||||
item = testdir.getitem("""
|
|
||||||
def setup_module(mod):
|
|
||||||
print "world"
|
|
||||||
raise ValueError(42)
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
""")
|
|
||||||
evrec = testdir.geteventrecorder(item.config)
|
|
||||||
setup = SetupState()
|
|
||||||
res = setup.setupitem(item)
|
|
||||||
assert not res
|
|
||||||
rep = evrec.popevent("itemsetupreport").rep
|
|
||||||
assert rep.failed
|
|
||||||
assert not rep.skipped
|
|
||||||
assert rep.excrepr
|
|
||||||
assert "42" in str(rep.excrepr)
|
|
||||||
assert rep.outerr[0].find("world") != -1
|
|
||||||
|
|
||||||
def test_teardownitem_fails(self, testdir):
|
|
||||||
item = testdir.getitem("""
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
def teardown_function(func):
|
|
||||||
print "13"
|
|
||||||
raise ValueError(25)
|
|
||||||
""")
|
|
||||||
evrec = testdir.geteventrecorder(item.config)
|
|
||||||
setup = SetupState()
|
|
||||||
res = setup.setupitem(item)
|
|
||||||
assert res
|
|
||||||
setup.teardownitem(item)
|
|
||||||
rep = evrec.popevent("itemsetupreport").rep
|
|
||||||
assert rep.item == item
|
|
||||||
assert rep.failed
|
|
||||||
assert not rep.passed
|
|
||||||
assert "13" in rep.outerr[0]
|
|
||||||
assert "25" in str(rep.excrepr)
|
|
||||||
|
|
||||||
def test_setupitem_skips(self, testdir):
|
|
||||||
item = testdir.getitem("""
|
|
||||||
import py
|
|
||||||
def setup_module(mod):
|
|
||||||
py.test.skip("17")
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
""")
|
|
||||||
evrec = testdir.geteventrecorder(item.config)
|
|
||||||
setup = SetupState()
|
|
||||||
setup.setupitem(item)
|
|
||||||
rep = evrec.popevent("itemsetupreport").rep
|
|
||||||
assert not rep.failed
|
|
||||||
assert rep.skipped
|
|
||||||
assert rep.excrepr
|
|
||||||
assert "17" in str(rep.excrepr)
|
|
Loading…
Reference in New Issue