[py-svn] r63560 - in py/trunk/py/test: . dist/testing plugin testing
hpk at codespeak.net
hpk at codespeak.net
Fri Apr 3 12:57:37 CEST 2009
Author: hpk
Date: Fri Apr 3 12:57:34 2009
New Revision: 63560
Modified:
py/trunk/py/test/dist/testing/test_txnode.py
py/trunk/py/test/event.py
py/trunk/py/test/plugin/api.py
py/trunk/py/test/plugin/pytest_eventlog.py
py/trunk/py/test/plugin/pytest_execnetcleanup.py
py/trunk/py/test/plugin/pytest_pytester.py
py/trunk/py/test/plugin/pytest_resultdb.py
py/trunk/py/test/plugin/pytest_resultlog.py
py/trunk/py/test/plugin/pytest_terminal.py
py/trunk/py/test/session.py
py/trunk/py/test/testing/test_session.py
Log:
beginning to review/polish test events
* pyevent() now receives args and kwargs as simple arguments
* refactoring event handling in tests
Modified: py/trunk/py/test/dist/testing/test_txnode.py
==============================================================================
--- py/trunk/py/test/dist/testing/test_txnode.py (original)
+++ py/trunk/py/test/dist/testing/test_txnode.py Fri Apr 3 12:57:34 2009
@@ -9,7 +9,7 @@
self.queue = queue
bus.register(self)
- def pyevent(self, eventname, *args, **kwargs):
+ def pyevent(self, eventname, args, kwargs):
self.queue.put((eventname, args, kwargs))
def geteventargs(self, eventname, timeout=2.0):
@@ -48,7 +48,7 @@
assert not self.node.channel.isclosed()
return self.node
- def finalize(self):
+ def xfinalize(self):
if hasattr(self, 'node'):
gw = self.node.gateway
print "exiting:", gw
@@ -56,7 +56,7 @@
def pytest_funcarg__mysetup(pyfuncitem):
mysetup = MySetup(pyfuncitem)
- pyfuncitem.addfinalizer(mysetup.finalize)
+ #pyfuncitem.addfinalizer(mysetup.finalize)
return mysetup
def pytest_funcarg__testdir(__call__, pyfuncitem):
Modified: py/trunk/py/test/event.py
==============================================================================
--- py/trunk/py/test/event.py (original)
+++ py/trunk/py/test/event.py Fri Apr 3 12:57:34 2009
@@ -22,10 +22,6 @@
# Basic Live Reporting Events
# ----------------------------------------------------------------------
-class TestrunStart(BaseEvent):
- def __init__(self):
- self.timestart = time.time()
-
class TestrunFinish(BaseEvent):
def __init__(self, exitstatus=0, excinfo=None):
self.exitstatus = exitstatus
Modified: py/trunk/py/test/plugin/api.py
==============================================================================
--- py/trunk/py/test/plugin/api.py (original)
+++ py/trunk/py/test/plugin/api.py Fri Apr 3 12:57:34 2009
@@ -55,7 +55,7 @@
class Events:
# Events
- def pyevent(self, eventname, *args, **kwargs):
+ def pyevent(self, eventname, args, kwargs):
""" generically called for each notification event. """
def pyevent__gateway_init(self, gateway):
@@ -76,7 +76,7 @@
def pyevent__internalerror(self, event):
""" called for internal errors. """
- def pyevent__itemstart(self, item, node):
+ def pyevent__itemstart(self, item, node=None):
""" test item gets collected. """
def pyevent__itemtestreport(self, event):
@@ -91,7 +91,7 @@
def pyevent__collectionreport(self, event):
""" collector finished collecting. """
- def pyevent__testrunstart(self, event):
+ def pyevent__testrunstart(self):
""" whole test run starts. """
def pyevent__testrunfinish(self, event):
Modified: py/trunk/py/test/plugin/pytest_eventlog.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_eventlog.py (original)
+++ py/trunk/py/test/plugin/pytest_eventlog.py Fri Apr 3 12:57:34 2009
@@ -16,7 +16,7 @@
self.eventlogfile.close()
del self.eventlogfile
- def pyevent(self, eventname, *args, **kwargs):
+ def pyevent(self, eventname, args, kwargs):
if hasattr(self, 'eventlogfile'):
f = self.eventlogfile
print >>f, eventname, args, kwargs
@@ -36,6 +36,6 @@
""")
testdir.runpytest("--eventlog=event.log")
s = testdir.tmpdir.join("event.log").read()
- assert s.find("TestrunStart") != -1
+ assert s.find("testrunstart") != -1
assert s.find("ItemTestReport") != -1
assert s.find("TestrunFinish") != -1
Modified: py/trunk/py/test/plugin/pytest_execnetcleanup.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_execnetcleanup.py (original)
+++ py/trunk/py/test/plugin/pytest_execnetcleanup.py Fri Apr 3 12:57:34 2009
@@ -21,8 +21,8 @@
if self._gateways is not None:
self._gateways.remove(gateway)
- def pyevent__testrunstart(self, event):
- self.trace("testrunstart", event)
+ def pyevent__testrunstart(self):
+ self.trace("testrunstart")
self._gateways = []
def pyevent__testrunfinish(self, event):
Modified: py/trunk/py/test/plugin/pytest_pytester.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_pytester.py (original)
+++ py/trunk/py/test/plugin/pytest_pytester.py Fri Apr 3 12:57:34 2009
@@ -3,8 +3,10 @@
"""
import py
+import inspect
from py.__.test import event
from py.__.test.config import Config as pytestConfig
+import api
class PytesterPlugin:
def pytest_funcarg__linecomp(self, pyfuncitem):
@@ -257,6 +259,13 @@
def __repr__(self):
return "<Event %r %r>" %(self.name, self.args)
+class ParsedEvent:
+ def __init__(self, locals):
+ self.__dict__ = locals.copy()
+
+ def __repr__(self):
+ return "<Event %r>" %(self.__dict__,)
+
class EventRecorder(object):
def __init__(self, pyplugins, debug=False): # True):
self.events = []
@@ -264,7 +273,7 @@
self.debug = debug
pyplugins.register(self)
- def pyevent(self, name, *args, **kwargs):
+ def pyevent(self, name, args, kwargs):
if name == "plugin_registered" and args == (self,):
return
if self.debug:
@@ -278,12 +287,42 @@
return event
raise KeyError("popevent: %r not found in %r" %(name, self.events))
+ def getevents(self, eventname):
+ method = self.geteventmethod(eventname)
+ l = []
+ for event in self.events:
+ if event.name == eventname:
+ pevent = method(*event.args, **event.kwargs)
+ l.append(pevent)
+ return l
+
+ def geteventmethod(self, eventname):
+ mname = "pyevent__" + eventname
+ method = getattr(api.Events, mname)
+ args, varargs, varkw, default = inspect.getargspec(method)
+ assert args[0] == "self"
+ args = args[1:]
+ fspec = inspect.formatargspec(args, varargs, varkw, default)
+ source = """def %(mname)s%(fspec)s:
+ return ParsedEvent(locals())""" % locals()
+ print source
+ exec source
+ return locals()[mname]
+
+
+ def firstparsedevent(self, eventname):
+ return self.parsedevents(eventname)[0]
+
def get(self, cls):
l = []
for event in self.events:
- value = event.args[0]
- if isinstance(value, cls):
- l.append(value)
+ try:
+ value = event.args[0]
+ except IndexError:
+ continue
+ else:
+ if isinstance(value, cls):
+ l.append(value)
return l
def getnamed(self, *names):
Modified: py/trunk/py/test/plugin/pytest_resultdb.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_resultdb.py (original)
+++ py/trunk/py/test/plugin/pytest_resultdb.py Fri Apr 3 12:57:34 2009
@@ -370,7 +370,7 @@
except ValueError:
excinfo = event.InternalException()
reslog = ResultDB(StringIO.StringIO())
- reslog.pyevent("internalerror", excinfo)
+ reslog.pyevent("internalerror", (excinfo,), {})
entry = reslog.logfile.getvalue()
entry_lines = entry.splitlines()
Modified: py/trunk/py/test/plugin/pytest_resultlog.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_resultlog.py (original)
+++ py/trunk/py/test/plugin/pytest_resultlog.py Fri Apr 3 12:57:34 2009
@@ -81,7 +81,9 @@
shortrepr, longrepr = getoutcomecodes(event)
self.write_log_entry(shortrepr, gpath, longrepr)
- def pyevent(self, eventname, event, *args, **kwargs):
+ def pyevent(self, eventname, args, kwargs):
+ if args:
+ event = args[0]
if eventname == "itemtestreport":
self.log_outcome(event)
elif eventname == "collectionreport":
@@ -91,6 +93,7 @@
path = event.repr.reprcrash.path # fishing :(
self.write_log_entry('!', path, str(event.repr))
+
# ===============================================================================
#
# plugin tests
@@ -223,7 +226,7 @@
except ValueError:
excinfo = event.InternalException()
reslog = ResultLog(StringIO.StringIO())
- reslog.pyevent("internalerror", excinfo)
+ reslog.pyevent("internalerror", (excinfo,), {})
entry = reslog.logfile.getvalue()
entry_lines = entry.splitlines()
Modified: py/trunk/py/test/plugin/pytest_terminal.py
==============================================================================
--- py/trunk/py/test/plugin/pytest_terminal.py (original)
+++ py/trunk/py/test/plugin/pytest_terminal.py Fri Apr 3 12:57:34 2009
@@ -194,7 +194,7 @@
self.stats.setdefault("skipped", []).append(event)
self.write_fspath_result(event.colitem.fspath, "S")
- def pyevent__testrunstart(self, event):
+ def pyevent__testrunstart(self):
self.write_sep("=", "test session starts", bold=True)
self._sessionstarttime = py.std.time.time()
@@ -370,7 +370,7 @@
""")
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep)
- rep.config.bus.notify("testrunstart", event.TestrunStart())
+ rep.config.bus.notify("testrunstart")
for item in testdir.genitems([modcol]):
ev = basic_run_report(item)
@@ -397,7 +397,7 @@
""", configargs=("-v",))
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep)
- rep.config.bus.notify("testrunstart", event.TestrunStart())
+ rep.config.bus.notify("testrunstart")
items = modcol.collect()
rep.config.option.debug = True #
for item in items:
@@ -422,7 +422,7 @@
modcol = testdir.getmodulecol("import xyz")
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep)
- rep.config.bus.notify("testrunstart", event.TestrunStart())
+ rep.config.bus.notify("testrunstart")
l = list(testdir.genitems([modcol]))
assert len(l) == 0
linecomp.assert_contains_lines([
@@ -518,8 +518,8 @@
""", configargs=("--tb=%s" % tbopt,))
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep)
- rep.config.bus.notify("testrunstart", event.TestrunStart())
- rep.config.bus.notify("testrunstart", event.TestrunStart())
+ rep.config.bus.notify("testrunstart")
+ rep.config.bus.notify("testrunstart")
for item in testdir.genitems([modcol]):
rep.config.bus.notify("itemtestreport", basic_run_report(item))
rep.config.bus.notify("testrunfinish", event.TestrunFinish())
@@ -566,7 +566,7 @@
rep = TerminalReporter(modcol.config, file=linecomp.stringio)
modcol.config.bus.register(rep)
bus = modcol.config.bus
- bus.notify("testrunstart", event.TestrunStart())
+ bus.notify("testrunstart")
try:
for item in testdir.genitems([modcol]):
bus.notify("itemtestreport", basic_run_report(item))
Modified: py/trunk/py/test/session.py
==============================================================================
--- py/trunk/py/test/session.py (original)
+++ py/trunk/py/test/session.py Fri Apr 3 12:57:34 2009
@@ -79,7 +79,7 @@
def sessionstarts(self):
""" setup any neccessary resources ahead of the test run. """
- self.bus.notify("testrunstart", event.TestrunStart())
+ self.bus.notify("testrunstart")
def pyevent__itemtestreport(self, rep):
if rep.failed:
Modified: py/trunk/py/test/testing/test_session.py
==============================================================================
--- py/trunk/py/test/testing/test_session.py (original)
+++ py/trunk/py/test/testing/test_session.py Fri Apr 3 12:57:34 2009
@@ -25,11 +25,11 @@
assert failed[0].colitem.name == "test_one_one"
assert failed[1].colitem.name == "test_other"
assert failed[2].colitem.name == "test_two"
- itemstarted = sorter.getnamed("itemstart")
+ itemstarted = sorter.getevents("itemstart")
assert len(itemstarted) == 4
- colstarted = sorter.getnamed("collectionstart")
+ colstarted = sorter.getevents("collectionstart")
assert len(colstarted) == 1
- col = colstarted[0].collector
+ col = colstarted[0].event.collector
assert isinstance(col, py.test.collect.Module)
def test_nested_import_error(self, testdir):
More information about the pytest-commit
mailing list