[py-svn] py-trunk commit 7cf598723a72: * rather expose internal exceptions under py.test.ACTION.Exception
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Wed Apr 28 08:43:26 CEST 2010
# HG changeset patch -- Bitbucket.org
# Project py-trunk
# URL http://bitbucket.org/hpk42/py-trunk/overview
# User holger krekel <holger at merlinux.eu>
# Date 1272436976 -7200
# Node ID 7cf598723a729f36167fad764a15526c7b39a780
# Parent 52f5dfc7ef98dd8d1cbca6314aae3fb83a360706
* rather expose internal exceptions under py.test.ACTION.Exception
with ACTION being skip, fail, exit, raises.
* move and refine test_outcome.py tests into runner tests
--- a/py/_plugin/pytest_pdb.py
+++ b/py/_plugin/pytest_pdb.py
@@ -17,7 +17,7 @@ def pytest_configure(config):
class PdbInvoke:
def pytest_runtest_makereport(self, item, call):
if call.excinfo and not \
- call.excinfo.errisinstance(py.test.exc.Skipped):
+ call.excinfo.errisinstance(py.test.skip.Exception):
# play well with capturing, slightly hackish
capman = item.config.pluginmanager.getplugin('capturemanager')
capman.suspendcapture()
--- a/py/_plugin/pytest_runner.py
+++ b/py/_plugin/pytest_runner.py
@@ -5,15 +5,7 @@ collect and run test items and create re
import py, sys
def pytest_namespace():
- class exc:
- """ namespace holding py.test runner exceptions. """
- Skipped = Skipped
- ExceptionFailure = ExceptionFailure
- Failed = Failed
- Exit = Exit
-
return {
- 'exc' : exc,
'raises' : raises,
'skip' : skip,
'importorskip' : importorskip,
@@ -157,7 +149,7 @@ class ItemTestReport(BaseReport):
self.failed = True
shortrepr = "?"
longrepr = excinfo
- elif excinfo.errisinstance(py.test.exc.Skipped):
+ elif excinfo.errisinstance(py.test.skip.Exception):
self.skipped = True
shortrepr = "s"
longrepr = self.item._repr_failure_py(excinfo)
@@ -196,7 +188,7 @@ class CollectReport(BaseReport):
self.result = result
else:
self.longrepr = self.collector._repr_failure_py(excinfo)
- if excinfo.errisinstance(py.test.exc.Skipped):
+ if excinfo.errisinstance(py.test.skip.Exception):
self.skipped = True
self.reason = str(excinfo.value)
else:
@@ -322,6 +314,8 @@ def exit(msg):
__tracebackhide__ = True
raise Exit(msg)
+exit.Exception = Exit
+
def skip(msg=""):
""" skip an executing test with the given message. Note: it's usually
better use the py.test.mark.skipif marker to declare a test to be
@@ -331,11 +325,15 @@ def skip(msg=""):
__tracebackhide__ = True
raise Skipped(msg=msg)
+skip.Exception = Skipped
+
def fail(msg=""):
""" explicitely fail an currently-executing test with the given Message. """
__tracebackhide__ = True
raise Failed(msg=msg)
+fail.Exception = Failed
+
def raises(ExpectedException, *args, **kwargs):
""" if args[0] is callable: raise AssertionError if calling it with
the remaining arguments does not raise the expected exception.
@@ -375,6 +373,8 @@ def raises(ExpectedException, *args, **k
raise ExceptionFailure(msg="DID NOT RAISE",
expr=args, expected=ExpectedException)
+raises.Exception = ExceptionFailure
+
def importorskip(modname, minversion=None):
""" return imported module if it has a higher __version__ than the
optionally specified 'minversion' - otherwise call py.test.skip()
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,8 +9,9 @@ Changes between 1.2.1 and 1.2.2 (release
- added links to the new capturelog and coverage plugins
- (issue87) fix unboundlocal error in assertionold code
- (issue86) improve documentation for looponfailing
-- expose some internal test running exceptions under py.test.exc.*
- and shift raises/importorskip etc. helper definitions to runner plugin .
+- expose test outcome related exceptions as py.test.skip.Exception,
+ py.test.raises.Exception etc., useful mostly for plugins
+ doing special outcome interpreteration/tweaking
- ship distribute_setup.py version 0.6.10
--- a/py/_test/pluginmanager.py
+++ b/py/_test/pluginmanager.py
@@ -138,7 +138,7 @@ class PluginManager(object):
mod = importplugin(modname)
except KeyboardInterrupt:
raise
- except py.test.exc.Skipped:
+ except py.test.skip.Exception:
e = py.std.sys.exc_info()[1]
self._hints.append("skipped plugin %r: %s" %((modname, e.msg)))
else:
--- a/testing/test_config.py
+++ b/testing/test_config.py
@@ -76,12 +76,12 @@ class TestConfigAPI:
def test_config_getvalueorskip(self, testdir):
config = testdir.parseconfig()
- py.test.raises(py.test.exc.Skipped,
+ py.test.raises(py.test.skip.Exception,
"config.getvalueorskip('hello')")
verbose = config.getvalueorskip("verbose")
assert verbose == config.option.verbose
config.option.hello = None
- py.test.raises(py.test.exc.Skipped,
+ py.test.raises(py.test.skip.Exception,
"config.getvalueorskip('hello')")
def test_config_overwrite(self, testdir):
--- a/testing/root/test_py_imports.py
+++ b/testing/root/test_py_imports.py
@@ -51,7 +51,7 @@ def test_importall():
modpath = 'py.%s' % relpath
try:
check_import(modpath)
- except py.test.exc.Skipped:
+ except py.test.skip.Exception:
pass
def check_import(modpath):
--- a/testing/test_outcome.py
+++ /dev/null
@@ -1,83 +0,0 @@
-
-import py
-import sys
-
-class TestRaises:
- def test_raises(self):
- py.test.raises(ValueError, "int('qwe')")
-
- def test_raises_exec(self):
- py.test.raises(ValueError, "a,x = []")
-
- def test_raises_syntax_error(self):
- py.test.raises(SyntaxError, "qwe qwe qwe")
-
- def test_raises_function(self):
- py.test.raises(ValueError, int, 'hello')
-
- def test_raises_callable_no_exception(self):
- class A:
- def __call__(self):
- pass
- try:
- py.test.raises(ValueError, A())
- except py.test.exc.ExceptionFailure:
- pass
-
-def test_pytest_exit():
- try:
- py.test.exit("hello")
- except:
- excinfo = py.code.ExceptionInfo()
- assert excinfo.errisinstance(KeyboardInterrupt)
-
-def test_exception_printing_skip():
- try:
- py.test.skip("hello")
- except Exception:
- excinfo = py.code.ExceptionInfo()
- s = excinfo.exconly(tryshort=True)
- assert s.startswith("Skipped")
-
-def test_importorskip():
- importorskip = py.test.importorskip
- try:
- sys = importorskip("sys")
- assert sys == py.std.sys
- #path = py.test.importorskip("os.path")
- #assert path == py.std.os.path
- py.test.raises(py.test.exc.Skipped,
- "py.test.importorskip('alskdj')")
- py.test.raises(SyntaxError, "py.test.importorskip('x y z')")
- py.test.raises(SyntaxError, "py.test.importorskip('x=y')")
- path = importorskip("py", minversion=".".join(py.__version__))
- mod = py.std.types.ModuleType("hello123")
- mod.__version__ = "1.3"
- py.test.raises(py.test.exc.Skipped, """
- py.test.importorskip("hello123", minversion="5.0")
- """)
- except py.test.exc.Skipped:
- print(py.code.ExceptionInfo())
- py.test.fail("spurious skip")
-
-def test_importorskip_imports_last_module_part():
- import os
- ospath = py.test.importorskip("os.path")
- assert os.path == ospath
-
-
-def test_pytest_cmdline_main(testdir):
- p = testdir.makepyfile("""
- import sys
- sys.path.insert(0, %r)
- import py
- def test_hello():
- assert 1
- if __name__ == '__main__':
- py.test.cmdline.main([__file__])
- """ % (str(py._pydir.dirpath())))
- import subprocess
- popen = subprocess.Popen([sys.executable, str(p)], stdout=subprocess.PIPE)
- s = popen.stdout.read()
- ret = popen.wait()
- assert ret == 0
--- a/testing/plugin/test_pytest_runner.py
+++ b/testing/plugin/test_pytest_runner.py
@@ -1,4 +1,4 @@
-import py
+import py, sys
from py._plugin import pytest_runner as runner
from py._code.code import ReprExceptionInfo
@@ -201,9 +201,9 @@ class BaseFunctionalTests:
testdir.runitem("""
import py
def test_func():
- raise py.test.exc.Exit()
+ raise py.test.exit.Exception()
""")
- except py.test.exc.Exit:
+ except py.test.exit.Exception:
pass
else:
py.test.fail("did not raise")
@@ -313,3 +313,91 @@ def test_runtest_in_module_ordering(test
assert result.stdout.fnmatch_lines([
"*2 passed*"
])
+
+class TestRaises:
+ def test_raises(self):
+ py.test.raises(ValueError, "int('qwe')")
+
+ def test_raises_exec(self):
+ py.test.raises(ValueError, "a,x = []")
+
+ def test_raises_syntax_error(self):
+ py.test.raises(SyntaxError, "qwe qwe qwe")
+
+ def test_raises_function(self):
+ py.test.raises(ValueError, int, 'hello')
+
+ def test_raises_callable_no_exception(self):
+ class A:
+ def __call__(self):
+ pass
+ try:
+ py.test.raises(ValueError, A())
+ except py.test.raises.Exception:
+ pass
+
+def test_pytest_exit():
+ try:
+ py.test.exit("hello")
+ except py.test.exit.Exception:
+ excinfo = py.code.ExceptionInfo()
+ assert excinfo.errisinstance(KeyboardInterrupt)
+
+def test_pytest_fail():
+ try:
+ py.test.fail("hello")
+ except py.test.fail.Exception:
+ excinfo = py.code.ExceptionInfo()
+ s = excinfo.exconly(tryshort=True)
+ assert s.startswith("Failed")
+
+def test_exception_printing_skip():
+ try:
+ py.test.skip("hello")
+ except py.test.skip.Exception:
+ excinfo = py.code.ExceptionInfo()
+ s = excinfo.exconly(tryshort=True)
+ assert s.startswith("Skipped")
+
+def test_importorskip():
+ importorskip = py.test.importorskip
+ try:
+ sys = importorskip("sys")
+ assert sys == py.std.sys
+ #path = py.test.importorskip("os.path")
+ #assert path == py.std.os.path
+ py.test.raises(py.test.skip.Exception,
+ "py.test.importorskip('alskdj')")
+ py.test.raises(SyntaxError, "py.test.importorskip('x y z')")
+ py.test.raises(SyntaxError, "py.test.importorskip('x=y')")
+ path = importorskip("py", minversion=".".join(py.__version__))
+ mod = py.std.types.ModuleType("hello123")
+ mod.__version__ = "1.3"
+ py.test.raises(py.test.skip.Exception, """
+ py.test.importorskip("hello123", minversion="5.0")
+ """)
+ except py.test.skip.Exception:
+ print(py.code.ExceptionInfo())
+ py.test.fail("spurious skip")
+
+def test_importorskip_imports_last_module_part():
+ import os
+ ospath = py.test.importorskip("os.path")
+ assert os.path == ospath
+
+
+def test_pytest_cmdline_main(testdir):
+ p = testdir.makepyfile("""
+ import sys
+ sys.path.insert(0, %r)
+ import py
+ def test_hello():
+ assert 1
+ if __name__ == '__main__':
+ py.test.cmdline.main([__file__])
+ """ % (str(py._pydir.dirpath())))
+ import subprocess
+ popen = subprocess.Popen([sys.executable, str(p)], stdout=subprocess.PIPE)
+ s = popen.stdout.read()
+ ret = popen.wait()
+ assert ret == 0
--- a/testing/test_pycollect.py
+++ b/testing/test_pycollect.py
@@ -444,7 +444,7 @@ def test_modulecol_roundtrip(testdir):
class TestTracebackCutting:
def test_skip_simple(self):
- excinfo = py.test.raises(py.test.exc.Skipped, 'py.test.skip("xxx")')
+ excinfo = py.test.raises(py.test.skip.Exception, 'py.test.skip("xxx")')
assert excinfo.traceback[-1].frame.code.name == "skip"
assert excinfo.traceback[-1].ishidden()
--- a/testing/test_deprecated_api.py
+++ b/testing/test_deprecated_api.py
@@ -190,7 +190,7 @@ class TestDisabled:
l = modcol.collect()
assert len(l) == 1
recwarn.clear()
- py.test.raises(py.test.exc.Skipped, "modcol.setup()")
+ py.test.raises(py.test.skip.Exception, "modcol.setup()")
recwarn.pop(DeprecationWarning)
def test_disabled_class(self, recwarn, testdir):
@@ -207,7 +207,7 @@ class TestDisabled:
l = modcol.collect()
assert len(l) == 1
recwarn.clear()
- py.test.raises(py.test.exc.Skipped, "modcol.setup()")
+ py.test.raises(py.test.skip.Exception, "modcol.setup()")
recwarn.pop(DeprecationWarning)
def test_disabled_class_functional(self, testdir):
More information about the pytest-commit
mailing list