[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