[py-svn] r57233 - in py/branch/event/py/test2: . dsession dsession/testing report testing

hpk at codespeak.net hpk at codespeak.net
Wed Aug 13 22:42:31 CEST 2008


Author: hpk
Date: Wed Aug 13 22:42:28 2008
New Revision: 57233

Modified:
   py/branch/event/py/test2/defaultconftest.py
   py/branch/event/py/test2/dsession/dsession.py
   py/branch/event/py/test2/dsession/testing/test_dsession.py
   py/branch/event/py/test2/report/base.py
   py/branch/event/py/test2/report/terminal.py
   py/branch/event/py/test2/runner.py
   py/branch/event/py/test2/session.py
   py/branch/event/py/test2/testing/acceptance_test.py
   py/branch/event/py/test2/testing/test_session.py
Log:
unify keyword/deselection of test handling, doing it directly via the 
Deselected event, not through skipped tests.


Modified: py/branch/event/py/test2/defaultconftest.py
==============================================================================
--- py/branch/event/py/test2/defaultconftest.py	(original)
+++ py/branch/event/py/test2/defaultconftest.py	Wed Aug 13 22:42:28 2008
@@ -41,11 +41,8 @@
                help="disable catching of sys.stdout/stderr output."),
         Option('-k',
                action="store", dest="keyword", default='',
-               help="only run test items matching the given (google-style) "
+               help="only run test items matching the given "
                     "keyword expression."),
-        Option('-j', '--keyword-oneshot',
-               action='store_true', dest='keyword_oneshot', default=False,
-               help="combined with -k, runs all tests after first hit"),
         Option('-l', '--showlocals',
                action="store_true", dest="showlocals", default=False,
                help="show locals in tracebacks (disabled by default)."),

Modified: py/branch/event/py/test2/dsession/dsession.py
==============================================================================
--- py/branch/event/py/test2/dsession/dsession.py	(original)
+++ py/branch/event/py/test2/dsession/dsession.py	Wed Aug 13 22:42:28 2008
@@ -59,8 +59,6 @@
             raise ValueError, "--looponfailing together with --pdb not supported."
         if option.executable and option.usepdb:
             raise ValueError, "--exec together with --pdb not supported."
-        if option.keyword_oneshot and not option.keyword:
-            raise ValueError, "--keyword-oneshot makes sense only when --keyword is supplied"
 
         config = self.config
         try:
@@ -234,23 +232,6 @@
         host = self.item2host.pop(item)
         self.host2pending[host].remove(item)
 
-    def filteritems(self, colitems):
-        """ return items to process (some may be deselected)"""
-        keywordexpr = self.config.option.keyword 
-        if not keywordexpr:
-            return colitems
-        remaining = []
-        deselected = []
-        for colitem in colitems:
-            if isinstance(colitem, Item):
-                if colitem._skipbykeyword(keywordexpr):
-                    deselected.append(colitem)
-                    continue
-            remaining.append(colitem)
-        if deselected: 
-            self.queue.put(event.Deselected(deselected))
-        return remaining 
-
     def handle_crashitem(self, item, host):
         longrepr = "%r CRASHED THE HOST %r" %(item, host)
         outcome = OutcomeRepr(when="execute", shortrepr="c", longrepr=longrepr)

Modified: py/branch/event/py/test2/dsession/testing/test_dsession.py
==============================================================================
--- py/branch/event/py/test2/dsession/testing/test_dsession.py	(original)
+++ py/branch/event/py/test2/dsession/testing/test_dsession.py	Wed Aug 13 22:42:28 2008
@@ -275,16 +275,19 @@
         dsel = session.filteritems([modcol])
         assert dsel == [modcol] 
         items = [modcol.join(x) for x in modcol.listdir()]
+        events = [] ; session.bus.subscribe(events.append)
         remaining = session.filteritems(items)
         assert remaining == []
-        ev = session.queue.get(block=False)
+        
+        ev = events[-1]
         assert isinstance(ev, event.Deselected)
         assert ev.items == items 
 
         modcol._config.option.keyword = "test_fail"
         remaining = session.filteritems(items)
         assert remaining == [items[0]]
-        ev = session.queue.get(block=False)
+
+        ev = events[-1]
         assert isinstance(ev, event.Deselected)
         assert ev.items == [items[1]]
 

Modified: py/branch/event/py/test2/report/base.py
==============================================================================
--- py/branch/event/py/test2/report/base.py	(original)
+++ py/branch/event/py/test2/report/base.py	Wed Aug 13 22:42:28 2008
@@ -12,6 +12,7 @@
         self._passed = []
         self._skipped = []
         self._failed = []
+        self._deselected = []
 
     def deactivate(self):
         if self._bus:
@@ -47,6 +48,9 @@
     def rep_TestrunStart(self, ev):
         self._reset()
 
+    def rep_Deselected(self, ev):
+        self._deselected.extend(ev.items)
+
     def _folded_skips(self):
         d = {}
         for event in self._skipped:

Modified: py/branch/event/py/test2/report/terminal.py
==============================================================================
--- py/branch/event/py/test2/report/terminal.py	(original)
+++ py/branch/event/py/test2/report/terminal.py	Wed Aug 13 22:42:28 2008
@@ -75,6 +75,8 @@
             self.summary_skips()
         elif ev.exitstatus == 2:
             self._tw.sep("!", "KEYBOARD INTERRUPT")
+        self._tw.line()
+        self.summary_deselected()
         self.summary_stats()
 
     def rep_LooponfailingInfo(self, ev):
@@ -109,7 +111,6 @@
         numskipped = len(self._skipped)
         numpassed = len(self._passed)
         sum = numfailed + numpassed
-        self._tw.line()
         self._tw.sep("=", "%d/%d passed + %d skips in %.2f seconds" %
                       (numpassed, sum, numskipped, session_duration), bold=True)
         if numfailed == 0:
@@ -118,6 +119,13 @@
             self._tw.sep("=", "failures: %d" %(numfailed), red=True)
         self._tw.line()
 
+    def summary_deselected(self):
+        if not self._deselected:
+            return
+        self._tw.sep("=", "%d tests deselected by %r" %(
+            len(self._deselected), self.config.option.keyword), bold=True)
+                                                
+
     def summary_skips(self):
         if not self._failed or self.config.option.showskipsummary:
             folded_skips = self._folded_skips()

Modified: py/branch/event/py/test2/runner.py
==============================================================================
--- py/branch/event/py/test2/runner.py	(original)
+++ py/branch/event/py/test2/runner.py	Wed Aug 13 22:42:28 2008
@@ -93,20 +93,6 @@
             kw = {'passed': OutcomeRepr(when, '', "")}
         return event.CollectionReport(self.colitem, res, **kw)
 
-class SkipRunner(RobustRun):
-    def __init__(self, colitem, msg):
-        super(SkipRunner, self).__init__(colitem)
-        self.msg = msg 
-    def setup(self): pass
-    def execute(self):
-        __tracebackhide__ = True
-        py.test2.skip(self.msg)
-    def teardown(self): pass 
-    def makereport(self, res, when, excinfo, outerr):
-        assert excinfo
-        kw = self.getkw(when, excinfo, outerr)
-        return event.ItemTestReport(self.colitem, **kw)
-
 NORESULT = object()
 # 
 # public entrypoints / objects 
@@ -121,10 +107,6 @@
         return "<OutcomeRepr when=%r, shortrepr=%r, len-longrepr=%s" %(
             self.when, self.shortrepr, len(str(self.longrepr)))
 
-def skip_report(item, msg):
-    __tracebackhide__ = True
-    return SkipRunner(item, msg).run()
-
 def basic_collect_report(item):
     return CollectorRunner(item).run()
     

Modified: py/branch/event/py/test2/session.py
==============================================================================
--- py/branch/event/py/test2/session.py	(original)
+++ py/branch/event/py/test2/session.py	Wed Aug 13 22:42:28 2008
@@ -14,7 +14,7 @@
 from py.__.test2.outcome import Exit
 Item = (py.test.collect.Item, py.test2.collect.Item)
 Collector = (py.test.collect.Collector, py.test2.collect.Collector)
-from runner import basic_collect_report, skip_report 
+from runner import basic_collect_report
 
 class Session(object): 
     """ 
@@ -24,6 +24,7 @@
     def __init__(self, config):
         self.config = config
         self.bus = EventBus()
+        self._nomatch = False
         eventlog = self.config.option.eventlog
         if eventlog:
             self.eventlog = py.path.local(eventlog)
@@ -48,20 +49,14 @@
             raise ValueError, "--looponfailing together with --dist not supported."
         if option.executable and option.usepdb:
             raise ValueError, "--exec together with --pdb not supported."
-        if option.keyword_oneshot and not option.keyword:
-            raise ValueError, "--keyword-oneshot makes sense only when --keyword is supplied"
 
     def genitems(self, colitems, keywordexpr=None):
         """ yield Items from iterating over the given colitems. """
         while colitems: 
             next = colitems.pop(0)
             if isinstance(next, Item):
-                if next._skipbykeyword(keywordexpr):
-                    ev = skip_report(next, "deselected by %r" %(keywordexpr))
-                    self.bus.notify(ev)
-                    if next._config.option.keyword_oneshot:
-                        keywordexpr = None
-                else:
+                remaining = self.filteritems([next])
+                if remaining:
                     self.bus.notify(event.ItemStart(next))
                     yield next 
             else:
@@ -73,6 +68,27 @@
                         yield x 
                 self.bus.notify(ev)
 
+    def filteritems(self, colitems):
+        """ return items to process (some may be deselected)"""
+        keywordexpr = self.config.option.keyword 
+        if not keywordexpr or self._nomatch:
+            return colitems
+        if keywordexpr[-1] == ":": 
+            keywordexpr = keywordexpr[:-1]
+        remaining = []
+        deselected = []
+        for colitem in colitems:
+            if isinstance(colitem, Item):
+                if colitem._skipbykeyword(keywordexpr):
+                    deselected.append(colitem)
+                    continue
+            remaining.append(colitem)
+        if deselected: 
+            self.bus.notify(event.Deselected(deselected, ))
+            if self.config.option.keyword.endswith(":"):
+                self._nomatch = True
+        return remaining 
+
     def collect(self): 
         colitems = [self.config.getfsnode(arg) for arg in self.config.args]
         keyword = self.config.option.keyword

Modified: py/branch/event/py/test2/testing/acceptance_test.py
==============================================================================
--- py/branch/event/py/test2/testing/acceptance_test.py	(original)
+++ py/branch/event/py/test2/testing/acceptance_test.py	Wed Aug 13 22:42:28 2008
@@ -119,6 +119,23 @@
         ])
         assert result.ret == 0
 
+    def test_deselected(self):
+        p1 = self.makepyfile(test_one="""
+                def test_one():
+                    pass
+                def test_two():
+                    pass
+                def test_three():
+                    pass
+           """,
+        )
+        result = self.runpytest("-k", "test_two:")
+        extra = assert_lines_contain_lines(result.outlines, [
+            "*test_one.py ..", 
+            "=* 1 test*deselected by 'test_two:'*=", 
+        ])
+        assert result.ret == 0
+
     def test_no_skip_summary_if_failure(self):
         p1 = self.makepyfile(test_one="""
             import py

Modified: py/branch/event/py/test2/testing/test_session.py
==============================================================================
--- py/branch/event/py/test2/testing/test_session.py	(original)
+++ py/branch/event/py/test2/testing/test_session.py	Wed Aug 13 22:42:28 2008
@@ -13,7 +13,7 @@
             passed, skipped, failed = sorter.listoutcomes()
             assert len(failed) == 1
             assert failed[0].colitem.name == name 
-            assert len(skipped) == 1
+            assert len(sorter.get(event.Deselected)) == 1
 
         for keyword in ['test_one', 'est_on']:
             yield check, keyword, 'test_one'
@@ -41,18 +41,20 @@
             passed, skipped, failed = sorter.listoutcomes()
             assert len(passed) == 1
             assert passed[0].colitem.name == "test_2"
-            assert len(skipped) == 1
-            assert skipped[0].colitem.name == 'test_1'
+            dlist = sorter.get(event.Deselected)
+            assert len(dlist) == 1
+            assert dlist[0].items[0].name == 'test_1'
 
     def test_select_starton(self):
         sorter = suptest.events_run_example("test_threepass.py", 
-                '-j', '-k', "test_two")
+                '-k', "test_two:")
         passed, skipped, failed = sorter.listoutcomes()
         assert len(passed) == 2
         assert not failed 
-        assert len(skipped) == 1
-        assert skipped[0].colitem.name == "test_one" 
-        assert skipped[0].skipped
+        dlist = sorter.get(event.Deselected)
+        assert len(dlist) == 1
+        item = dlist[0].items[0]
+        assert item.name == "test_one" 
 
 class TestSession:
 



More information about the pytest-commit mailing list