[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