regen and fix some docs (tox -e regen)

bump versions, depend on already released py-1.4.25
This commit is contained in:
holger krekel 2014-09-24 14:46:56 +02:00
parent bf7c5ea32c
commit 2eef674615
19 changed files with 656 additions and 203 deletions

View File

@ -1,4 +1,4 @@
NEXT
2.6.3
-----------
- fix issue575: xunit-xml was reporting collection errors as failures

View File

@ -1,2 +1,2 @@
#
__version__ = '2.6.3.dev3'
__version__ = '2.6.3'

View File

@ -0,0 +1,52 @@
pytest-2.6.3: fixes and little improvements
===========================================================================
pytest is a mature Python testing tool with more than a 1100 tests
against itself, passing on many different interpreters and platforms.
This release is drop-in compatible to 2.5.2 and 2.6.X.
See below for the changes and see docs at:
http://pytest.org
As usual, you can upgrade from pypi via::
pip install -U pytest
Thanks to all who contributed, among them:
Floris Bruynooghe
Oleg Sinyavskiy
Uwe Schmitt
Charles Cloud
Wolfgang Schnerring
have fun,
holger krekel
Changes 2.6.3
======================
- fix issue575: xunit-xml was reporting collection errors as failures
instead of errors, thanks Oleg Sinyavskiy.
- fix issue582: fix setuptools example, thanks Laszlo Papp and Ronny
Pfannschmidt.
- Fix infinite recursion bug when pickling capture.EncodedFile, thanks
Uwe Schmitt.
- fix issue589: fix bad interaction with numpy and others when showing
exceptions. Check for precise "maximum recursion depth exceed" exception
instead of presuming any RuntimeError is that one (implemented in py
dep). Thanks Charles Cloud for analysing the issue.
- fix conftest related fixture visibility issue: when running with a
CWD outside a test package pytest would get fixture discovery wrong.
Thanks to Wolfgang Schnerring for figuring out a reproducable example.
- Introduce pytest_enter_pdb hook (needed e.g. by pytest_timeout to cancel the
timeout when interactively entering pdb). Thanks Wolfgang Schnerring.
- check xfail/skip also with non-python function test items. Thanks
Floris Bruynooghe.

View File

@ -26,7 +26,7 @@ you will see the return value of the function call::
$ py.test test_assert1.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_assert1.py F
@ -135,7 +135,7 @@ if you run this module::
$ py.test test_assert2.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_assert2.py F

View File

@ -64,7 +64,7 @@ of the failing function and hide the other one::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_module.py .F
@ -78,7 +78,7 @@ of the failing function and hide the other one::
test_module.py:9: AssertionError
-------------------------- Captured stdout setup ---------------------------
setting up <function test_func2 at 0x2ae19606fc80>
setting up <function test_func2 at 0x2b3173d7fbf8>
==================== 1 failed, 1 passed in 0.01 seconds ====================
Accessing captured output from a test function

View File

@ -44,12 +44,12 @@ then you can just invoke ``py.test`` without command line options::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
mymodule.py .
========================= 1 passed in 0.07 seconds =========================
========================= 1 passed in 0.05 seconds =========================
It is possible to use fixtures using the ``getfixture`` helper::

View File

@ -31,7 +31,7 @@ You can then restrict a test run to only run tests marked with ``webtest``::
$ py.test -v -m webtest
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 4 items
test_server.py::test_send_http PASSED
@ -43,7 +43,7 @@ Or the inverse, running all tests except the webtest ones::
$ py.test -v -m "not webtest"
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 4 items
test_server.py::test_something_quick PASSED
@ -62,7 +62,7 @@ tests based on their module, class, method, or function name::
$ py.test -v test_server.py::TestClass::test_method
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 5 items
test_server.py::TestClass::test_method PASSED
@ -73,7 +73,7 @@ You can also select on the class::
$ py.test -v test_server.py::TestClass
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 4 items
test_server.py::TestClass::test_method PASSED
@ -84,7 +84,7 @@ Or select multiple nodes::
$ py.test -v test_server.py::TestClass test_server.py::test_send_http
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 8 items
test_server.py::TestClass::test_method PASSED
@ -120,7 +120,7 @@ select tests based on their names::
$ py.test -v -k http # running with the above defined example module
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 4 items
test_server.py::test_send_http PASSED
@ -132,7 +132,7 @@ And you can also run all tests except the ones that match the keyword::
$ py.test -k "not send_http" -v
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 4 items
test_server.py::test_something_quick PASSED
@ -140,20 +140,20 @@ And you can also run all tests except the ones that match the keyword::
test_server.py::TestClass::test_method PASSED
================= 1 tests deselected by '-knot send_http' ==================
================== 3 passed, 1 deselected in 0.01 seconds ==================
================== 3 passed, 1 deselected in 0.02 seconds ==================
Or to select "http" and "quick" tests::
$ py.test -k "http or quick" -v
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 4 items
test_server.py::test_send_http PASSED
test_server.py::test_something_quick PASSED
================= 2 tests deselected by '-khttp or quick' ==================
================== 2 passed, 2 deselected in 0.02 seconds ==================
================== 2 passed, 2 deselected in 0.01 seconds ==================
.. note::
@ -326,7 +326,7 @@ the test needs::
$ py.test -E stage2
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_someenv.py s
@ -337,7 +337,7 @@ and here is one that specifies exactly the environment needed::
$ py.test -E stage1
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_someenv.py .
@ -455,12 +455,12 @@ then you will see two test skipped and two executed tests as expected::
$ py.test -rs # this option reports skip reasons
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
test_plat.py sss.
========================= short test summary info ==========================
SKIP [3] /tmp/doc-exec-82/conftest.py:12: cannot run on platform linux
SKIP [3] /tmp/doc-exec-224/conftest.py:12: cannot run on platform linux
=================== 1 passed, 3 skipped in 0.01 seconds ====================
@ -468,7 +468,7 @@ Note that if you specify a platform via the marker-command line option like this
$ py.test -m linux2
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
test_plat.py s
@ -519,7 +519,7 @@ We can now use the ``-m option`` to select one set::
$ py.test -m interface --tb=short
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
test_module.py FF
@ -540,7 +540,7 @@ or to select both "event" and "interface" tests::
$ py.test -m "interface or event" --tb=short
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
test_module.py FFF
@ -559,4 +559,4 @@ or to select both "event" and "interface" tests::
assert 0
E assert 0
============= 1 tests deselected by "-m 'interface or event'" ==============
================== 3 failed, 1 deselected in 0.02 seconds ==================
================== 3 failed, 1 deselected in 0.01 seconds ==================

View File

@ -27,7 +27,7 @@ now execute the test specification::
nonpython $ py.test test_simple.yml
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_simple.yml .F
@ -37,7 +37,7 @@ now execute the test specification::
usecase execution failed
spec failed: 'some': 'other'
no further details known at this point.
==================== 1 failed, 1 passed in 0.04 seconds ====================
==================== 1 failed, 1 passed in 0.03 seconds ====================
You get one dot for the passing ``sub1: sub1`` check and one failure.
Obviously in the above ``conftest.py`` you'll want to implement a more
@ -56,7 +56,7 @@ consulted when reporting in ``verbose`` mode::
nonpython $ py.test -v
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 2 items
test_simple.yml::usecase: ok PASSED
@ -67,17 +67,17 @@ consulted when reporting in ``verbose`` mode::
usecase execution failed
spec failed: 'some': 'other'
no further details known at this point.
==================== 1 failed, 1 passed in 0.05 seconds ====================
==================== 1 failed, 1 passed in 0.03 seconds ====================
While developing your custom test collection and execution it's also
interesting to just look at the collection tree::
nonpython $ py.test --collect-only
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
<YamlFile 'test_simple.yml'>
<YamlItem 'ok'>
<YamlItem 'hello'>
============================= in 0.04 seconds =============================
============================= in 0.03 seconds =============================

View File

@ -106,7 +106,7 @@ this is a fully self-contained example which you can run with::
$ py.test test_scenarios.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
test_scenarios.py ....
@ -118,7 +118,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia
$ py.test --collect-only test_scenarios.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
<Module 'test_scenarios.py'>
<Class 'TestSampleWithScenarios'>
@ -182,7 +182,7 @@ Let's first see how it looks like at collection time::
$ py.test test_backends.py --collect-only
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
<Module 'test_backends.py'>
<Function 'test_db_initialized[d1]'>
@ -197,7 +197,7 @@ And then when we run the test::
================================= FAILURES =================================
_________________________ test_db_initialized[d2] __________________________
db = <conftest.DB2 object at 0x2b83684b5eb8>
db = <conftest.DB2 object at 0x2b24a8545390>
def test_db_initialized(db):
# a dummy test
@ -206,7 +206,7 @@ And then when we run the test::
E Failed: deliberately failing for demo purposes
test_backends.py:6: Failed
1 failed, 1 passed in 0.01 seconds
1 failed, 1 passed in 0.02 seconds
The first invocation with ``db == "DB1"`` passed while the second with ``db == "DB2"`` failed. Our ``db`` fixture function has instantiated each of the DB values during the setup phase while the ``pytest_generate_tests`` generated two according calls to the ``test_db_initialized`` during the collection phase.
@ -251,16 +251,16 @@ argument sets to use for each test function. Let's run it::
$ py.test -q
F..
================================= FAILURES =================================
________________________ TestClass.test_equals[2-1] ________________________
________________________ TestClass.test_equals[1-2] ________________________
self = <test_parametrize.TestClass object at 0x2ae94130e390>, a = 1, b = 2
self = <test_parametrize.TestClass object at 0x2b0ed5d8cdd8>, a = 1, b = 2
def test_equals(self, a, b):
> assert a == b
E assert 1 == 2
test_parametrize.py:18: AssertionError
1 failed, 2 passed in 0.01 seconds
1 failed, 2 passed in 0.02 seconds
Indirect parametrization with multiple fixtures
--------------------------------------------------------------
@ -279,12 +279,345 @@ is to be run with different sets of arguments for its three arguments:
Running it results in some skips if we don't have all the python interpreters installed and otherwise runs all combinations (5 interpreters times 5 interpreters times 3 objects to serialize/deserialize)::
. $ py.test -rs -q multipython.py
ssssssssssssssssssssssssssssssssssss......sssssssss......ssssssssssssssssss
========================= short test summary info ==========================
SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.5' not found
SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.8' not found
SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.4' not found
12 passed, 63 skipped in 0.65 seconds
..................FFFFFF...
================================= FAILURES =================================
________________ test_basic_objects[python3.4-python2.6-42] ________________
python1 = <multipython.Python object at 0x2b02a1bc79b0>
python2 = <multipython.Python object at 0x2b02a1bc7630>, obj = 42
@pytest.mark.parametrize("obj", [42, {}, {1:3},])
def test_basic_objects(python1, python2, obj):
python1.dumps(obj)
> python2.load_and_is_true("obj == %s" % obj)
multipython.py:51:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
multipython.py:46: in load_and_is_true
py.process.cmdexec("%s %s" %(self.pythonpath, loadfile))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cmd = '/home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p0/load.py'
def cmdexec(cmd):
""" return unicode output of executing 'cmd' in a separate process.
raise cmdexec.Error exeception if the command failed.
the exception will provide an 'err' attribute containing
the error-output from the command.
if the subprocess module does not provide a proper encoding/unicode strings
sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'.
"""
process = subprocess.Popen(cmd, shell=True,
universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not
try:
default_encoding = sys.getdefaultencoding() # jython may not have it
except AttributeError:
default_encoding = sys.stdout.encoding or 'UTF-8'
out = unicode(out, process.stdout.encoding or default_encoding)
err = unicode(err, process.stderr.encoding or default_encoding)
status = process.poll()
if status:
> raise ExecutionFailed(status, status, cmd, out, err)
E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p0/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-21/test_basic_objects_python3_4_p0/load.py", line 4, in <module>
E obj = pickle.load(f)
E File "/usr/lib/python2.6/pickle.py", line 1370, in load
E return Unpickler(file).load()
E File "/usr/lib/python2.6/pickle.py", line 858, in load
E dispatch[key](self)
E File "/usr/lib/python2.6/pickle.py", line 886, in load_proto
E raise ValueError, "unsupported pickle protocol: %d" % proto
E ValueError: unsupported pickle protocol: 3
../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-21/test_basic_objects_python3_4_p0/load.py
_______________ test_basic_objects[python3.4-python2.6-obj1] _______________
python1 = <multipython.Python object at 0x2b02a1b66f28>
python2 = <multipython.Python object at 0x2b02a1b66198>, obj = {}
@pytest.mark.parametrize("obj", [42, {}, {1:3},])
def test_basic_objects(python1, python2, obj):
python1.dumps(obj)
> python2.load_and_is_true("obj == %s" % obj)
multipython.py:51:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
multipython.py:46: in load_and_is_true
py.process.cmdexec("%s %s" %(self.pythonpath, loadfile))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cmd = '/home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p1/load.py'
def cmdexec(cmd):
""" return unicode output of executing 'cmd' in a separate process.
raise cmdexec.Error exeception if the command failed.
the exception will provide an 'err' attribute containing
the error-output from the command.
if the subprocess module does not provide a proper encoding/unicode strings
sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'.
"""
process = subprocess.Popen(cmd, shell=True,
universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not
try:
default_encoding = sys.getdefaultencoding() # jython may not have it
except AttributeError:
default_encoding = sys.stdout.encoding or 'UTF-8'
out = unicode(out, process.stdout.encoding or default_encoding)
err = unicode(err, process.stderr.encoding or default_encoding)
status = process.poll()
if status:
> raise ExecutionFailed(status, status, cmd, out, err)
E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p1/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-21/test_basic_objects_python3_4_p1/load.py", line 4, in <module>
E obj = pickle.load(f)
E File "/usr/lib/python2.6/pickle.py", line 1370, in load
E return Unpickler(file).load()
E File "/usr/lib/python2.6/pickle.py", line 858, in load
E dispatch[key](self)
E File "/usr/lib/python2.6/pickle.py", line 886, in load_proto
E raise ValueError, "unsupported pickle protocol: %d" % proto
E ValueError: unsupported pickle protocol: 3
../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-21/test_basic_objects_python3_4_p1/load.py
_______________ test_basic_objects[python3.4-python2.6-obj2] _______________
python1 = <multipython.Python object at 0x2b02a1bcd320>
python2 = <multipython.Python object at 0x2b02a1bcd358>, obj = {1: 3}
@pytest.mark.parametrize("obj", [42, {}, {1:3},])
def test_basic_objects(python1, python2, obj):
python1.dumps(obj)
> python2.load_and_is_true("obj == %s" % obj)
multipython.py:51:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
multipython.py:46: in load_and_is_true
py.process.cmdexec("%s %s" %(self.pythonpath, loadfile))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cmd = '/home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p2/load.py'
def cmdexec(cmd):
""" return unicode output of executing 'cmd' in a separate process.
raise cmdexec.Error exeception if the command failed.
the exception will provide an 'err' attribute containing
the error-output from the command.
if the subprocess module does not provide a proper encoding/unicode strings
sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'.
"""
process = subprocess.Popen(cmd, shell=True,
universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not
try:
default_encoding = sys.getdefaultencoding() # jython may not have it
except AttributeError:
default_encoding = sys.stdout.encoding or 'UTF-8'
out = unicode(out, process.stdout.encoding or default_encoding)
err = unicode(err, process.stderr.encoding or default_encoding)
status = process.poll()
if status:
> raise ExecutionFailed(status, status, cmd, out, err)
E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p2/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-21/test_basic_objects_python3_4_p2/load.py", line 4, in <module>
E obj = pickle.load(f)
E File "/usr/lib/python2.6/pickle.py", line 1370, in load
E return Unpickler(file).load()
E File "/usr/lib/python2.6/pickle.py", line 858, in load
E dispatch[key](self)
E File "/usr/lib/python2.6/pickle.py", line 886, in load_proto
E raise ValueError, "unsupported pickle protocol: %d" % proto
E ValueError: unsupported pickle protocol: 3
../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-21/test_basic_objects_python3_4_p2/load.py
________________ test_basic_objects[python3.4-python2.7-42] ________________
python1 = <multipython.Python object at 0x2b02a1bc78d0>
python2 = <multipython.Python object at 0x2b02a1bc7128>, obj = 42
@pytest.mark.parametrize("obj", [42, {}, {1:3},])
def test_basic_objects(python1, python2, obj):
python1.dumps(obj)
> python2.load_and_is_true("obj == %s" % obj)
multipython.py:51:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
multipython.py:46: in load_and_is_true
py.process.cmdexec("%s %s" %(self.pythonpath, loadfile))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cmd = '/home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p3/load.py'
def cmdexec(cmd):
""" return unicode output of executing 'cmd' in a separate process.
raise cmdexec.Error exeception if the command failed.
the exception will provide an 'err' attribute containing
the error-output from the command.
if the subprocess module does not provide a proper encoding/unicode strings
sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'.
"""
process = subprocess.Popen(cmd, shell=True,
universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not
try:
default_encoding = sys.getdefaultencoding() # jython may not have it
except AttributeError:
default_encoding = sys.stdout.encoding or 'UTF-8'
out = unicode(out, process.stdout.encoding or default_encoding)
err = unicode(err, process.stderr.encoding or default_encoding)
status = process.poll()
if status:
> raise ExecutionFailed(status, status, cmd, out, err)
E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p3/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-21/test_basic_objects_python3_4_p3/load.py", line 4, in <module>
E obj = pickle.load(f)
E File "/usr/lib/python2.7/pickle.py", line 1378, in load
E return Unpickler(file).load()
E File "/usr/lib/python2.7/pickle.py", line 858, in load
E dispatch[key](self)
E File "/usr/lib/python2.7/pickle.py", line 886, in load_proto
E raise ValueError, "unsupported pickle protocol: %d" % proto
E ValueError: unsupported pickle protocol: 3
../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-21/test_basic_objects_python3_4_p3/load.py
_______________ test_basic_objects[python3.4-python2.7-obj1] _______________
python1 = <multipython.Python object at 0x2b02a1bd2550>
python2 = <multipython.Python object at 0x2b02a1bd23c8>, obj = {}
@pytest.mark.parametrize("obj", [42, {}, {1:3},])
def test_basic_objects(python1, python2, obj):
python1.dumps(obj)
> python2.load_and_is_true("obj == %s" % obj)
multipython.py:51:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
multipython.py:46: in load_and_is_true
py.process.cmdexec("%s %s" %(self.pythonpath, loadfile))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cmd = '/home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p4/load.py'
def cmdexec(cmd):
""" return unicode output of executing 'cmd' in a separate process.
raise cmdexec.Error exeception if the command failed.
the exception will provide an 'err' attribute containing
the error-output from the command.
if the subprocess module does not provide a proper encoding/unicode strings
sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'.
"""
process = subprocess.Popen(cmd, shell=True,
universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not
try:
default_encoding = sys.getdefaultencoding() # jython may not have it
except AttributeError:
default_encoding = sys.stdout.encoding or 'UTF-8'
out = unicode(out, process.stdout.encoding or default_encoding)
err = unicode(err, process.stderr.encoding or default_encoding)
status = process.poll()
if status:
> raise ExecutionFailed(status, status, cmd, out, err)
E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p4/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-21/test_basic_objects_python3_4_p4/load.py", line 4, in <module>
E obj = pickle.load(f)
E File "/usr/lib/python2.7/pickle.py", line 1378, in load
E return Unpickler(file).load()
E File "/usr/lib/python2.7/pickle.py", line 858, in load
E dispatch[key](self)
E File "/usr/lib/python2.7/pickle.py", line 886, in load_proto
E raise ValueError, "unsupported pickle protocol: %d" % proto
E ValueError: unsupported pickle protocol: 3
../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-21/test_basic_objects_python3_4_p4/load.py
_______________ test_basic_objects[python3.4-python2.7-obj2] _______________
python1 = <multipython.Python object at 0x2b02a1bcdeb8>
python2 = <multipython.Python object at 0x2b02a1bcdf98>, obj = {1: 3}
@pytest.mark.parametrize("obj", [42, {}, {1:3},])
def test_basic_objects(python1, python2, obj):
python1.dumps(obj)
> python2.load_and_is_true("obj == %s" % obj)
multipython.py:51:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
multipython.py:46: in load_and_is_true
py.process.cmdexec("%s %s" %(self.pythonpath, loadfile))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cmd = '/home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p5/load.py'
def cmdexec(cmd):
""" return unicode output of executing 'cmd' in a separate process.
raise cmdexec.Error exeception if the command failed.
the exception will provide an 'err' attribute containing
the error-output from the command.
if the subprocess module does not provide a proper encoding/unicode strings
sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'.
"""
process = subprocess.Popen(cmd, shell=True,
universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not
try:
default_encoding = sys.getdefaultencoding() # jython may not have it
except AttributeError:
default_encoding = sys.stdout.encoding or 'UTF-8'
out = unicode(out, process.stdout.encoding or default_encoding)
err = unicode(err, process.stderr.encoding or default_encoding)
status = process.poll()
if status:
> raise ExecutionFailed(status, status, cmd, out, err)
E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p5/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-21/test_basic_objects_python3_4_p5/load.py", line 4, in <module>
E obj = pickle.load(f)
E File "/usr/lib/python2.7/pickle.py", line 1378, in load
E return Unpickler(file).load()
E File "/usr/lib/python2.7/pickle.py", line 858, in load
E dispatch[key](self)
E File "/usr/lib/python2.7/pickle.py", line 886, in load_proto
E raise ValueError, "unsupported pickle protocol: %d" % proto
E ValueError: unsupported pickle protocol: 3
../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-21/test_basic_objects_python3_4_p5/load.py
6 failed, 21 passed in 1.36 seconds
Indirect parametrization of optional implementations/imports
--------------------------------------------------------------------
@ -331,12 +664,12 @@ If you run this with reporting for skips enabled::
$ py.test -rs test_module.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_module.py .s
========================= short test summary info ==========================
SKIP [1] /tmp/doc-exec-240/conftest.py:10: could not import 'opt2'
SKIP [1] /tmp/doc-exec-226/conftest.py:10: could not import 'opt2'
=================== 1 passed, 1 skipped in 0.01 seconds ====================

View File

@ -43,7 +43,7 @@ then the test collection looks like this::
$ py.test --collect-only
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
<Module 'check_myapp.py'>
<Class 'CheckMyApp'>
@ -88,7 +88,7 @@ You can always peek at the collection tree without running tests like this::
. $ py.test --collect-only pythoncollection.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 3 items
<Module 'pythoncollection.py'>
<Function 'test_function'>
@ -141,7 +141,7 @@ interpreters and will leave out the setup.py file::
$ py.test --collect-only
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 0 items
============================= in 0.01 seconds =============================

View File

@ -13,10 +13,10 @@ get on the terminal - we are working on that):
assertion $ py.test failure_demo.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
collected 39 items
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 42 items
failure_demo.py FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
failure_demo.py FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
================================= FAILURES =================================
____________________________ test_generative[0] ____________________________
@ -30,7 +30,7 @@ get on the terminal - we are working on that):
failure_demo.py:15: AssertionError
_________________________ TestFailing.test_simple __________________________
self = <failure_demo.TestFailing object at 0x2aab6e68c550>
self = <failure_demo.TestFailing object at 0x2adb9885cfd0>
def test_simple(self):
def f():
@ -40,13 +40,13 @@ get on the terminal - we are working on that):
> assert f() == g()
E assert 42 == 43
E + where 42 = <function TestFailing.test_simple.<locals>.f at 0x2aab6e7559d8>()
E + and 43 = <function TestFailing.test_simple.<locals>.g at 0x2aab6e755ea0>()
E + where 42 = <function TestFailing.test_simple.<locals>.f at 0x2adb9887e6a8>()
E + and 43 = <function TestFailing.test_simple.<locals>.g at 0x2adb9887e598>()
failure_demo.py:28: AssertionError
____________________ TestFailing.test_simple_multiline _____________________
self = <failure_demo.TestFailing object at 0x2aab6e7fcd68>
self = <failure_demo.TestFailing object at 0x2adb98841518>
def test_simple_multiline(self):
otherfunc_multi(
@ -66,19 +66,19 @@ get on the terminal - we are working on that):
failure_demo.py:11: AssertionError
___________________________ TestFailing.test_not ___________________________
self = <failure_demo.TestFailing object at 0x2aab6e7f7550>
self = <failure_demo.TestFailing object at 0x2adb98813278>
def test_not(self):
def f():
return 42
> assert not f()
E assert not 42
E + where 42 = <function TestFailing.test_not.<locals>.f at 0x2aab6e7617b8>()
E + where 42 = <function TestFailing.test_not.<locals>.f at 0x2adb9887e840>()
failure_demo.py:38: AssertionError
_________________ TestSpecialisedExplanations.test_eq_text _________________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7efdd8>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987a9588>
def test_eq_text(self):
> assert 'spam' == 'eggs'
@ -89,7 +89,7 @@ get on the terminal - we are working on that):
failure_demo.py:42: AssertionError
_____________ TestSpecialisedExplanations.test_eq_similar_text _____________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7bdb70>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb9881fe80>
def test_eq_similar_text(self):
> assert 'foo 1 bar' == 'foo 2 bar'
@ -102,7 +102,7 @@ get on the terminal - we are working on that):
failure_demo.py:45: AssertionError
____________ TestSpecialisedExplanations.test_eq_multiline_text ____________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e75d128>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb98894b38>
def test_eq_multiline_text(self):
> assert 'foo\nspam\nbar' == 'foo\neggs\nbar'
@ -115,7 +115,7 @@ get on the terminal - we are working on that):
failure_demo.py:48: AssertionError
______________ TestSpecialisedExplanations.test_eq_long_text _______________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e815b00>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb98812fd0>
def test_eq_long_text(self):
a = '1'*100 + 'a' + '2'*100
@ -132,7 +132,7 @@ get on the terminal - we are working on that):
failure_demo.py:53: AssertionError
_________ TestSpecialisedExplanations.test_eq_long_text_multiline __________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7cdc50>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987ce240>
def test_eq_long_text_multiline(self):
a = '1\n'*100 + 'a' + '2\n'*100
@ -156,7 +156,7 @@ get on the terminal - we are working on that):
failure_demo.py:58: AssertionError
_________________ TestSpecialisedExplanations.test_eq_list _________________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e80e2b0>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb98841a58>
def test_eq_list(self):
> assert [0, 1, 2] == [0, 1, 3]
@ -166,7 +166,7 @@ get on the terminal - we are working on that):
failure_demo.py:61: AssertionError
______________ TestSpecialisedExplanations.test_eq_list_long _______________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7df940>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987e4e48>
def test_eq_list_long(self):
a = [0]*100 + [1] + [3]*100
@ -178,7 +178,7 @@ get on the terminal - we are working on that):
failure_demo.py:66: AssertionError
_________________ TestSpecialisedExplanations.test_eq_dict _________________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7f7ba8>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb98843d30>
def test_eq_dict(self):
> assert {'a': 0, 'b': 1, 'c': 0} == {'a': 0, 'b': 2, 'd': 0}
@ -194,7 +194,7 @@ get on the terminal - we are working on that):
failure_demo.py:69: AssertionError
_________________ TestSpecialisedExplanations.test_eq_set __________________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e784fd0>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb98822b38>
def test_eq_set(self):
> assert set([0, 10, 11, 12]) == set([0, 20, 21])
@ -210,7 +210,7 @@ get on the terminal - we are working on that):
failure_demo.py:72: AssertionError
_____________ TestSpecialisedExplanations.test_eq_longer_list ______________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e777550>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987a96d8>
def test_eq_longer_list(self):
> assert [1,2] == [1,2,3]
@ -220,7 +220,7 @@ get on the terminal - we are working on that):
failure_demo.py:75: AssertionError
_________________ TestSpecialisedExplanations.test_in_list _________________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7c00f0>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987b72e8>
def test_in_list(self):
> assert 1 in [0, 2, 3, 4, 5]
@ -229,7 +229,7 @@ get on the terminal - we are working on that):
failure_demo.py:78: AssertionError
__________ TestSpecialisedExplanations.test_not_in_text_multiline __________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e7df588>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb98894908>
def test_not_in_text_multiline(self):
text = 'some multiline\ntext\nwhich\nincludes foo\nand a\ntail'
@ -247,7 +247,7 @@ get on the terminal - we are working on that):
failure_demo.py:82: AssertionError
___________ TestSpecialisedExplanations.test_not_in_text_single ____________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e75da58>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb9885c898>
def test_not_in_text_single(self):
text = 'single foo line'
@ -260,7 +260,7 @@ get on the terminal - we are working on that):
failure_demo.py:86: AssertionError
_________ TestSpecialisedExplanations.test_not_in_text_single_long _________
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e83d320>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987cc9e8>
def test_not_in_text_single_long(self):
text = 'head ' * 50 + 'foo ' + 'tail ' * 20
@ -273,7 +273,7 @@ get on the terminal - we are working on that):
failure_demo.py:90: AssertionError
______ TestSpecialisedExplanations.test_not_in_text_single_long_term _______
self = <failure_demo.TestSpecialisedExplanations object at 0x2aab6e815198>
self = <failure_demo.TestSpecialisedExplanations object at 0x2adb987d2748>
def test_not_in_text_single_long_term(self):
text = 'head ' * 50 + 'f'*70 + 'tail ' * 20
@ -292,7 +292,7 @@ get on the terminal - we are working on that):
i = Foo()
> assert i.b == 2
E assert 1 == 2
E + where 1 = <failure_demo.test_attribute.<locals>.Foo object at 0x2aab6e61ed30>.b
E + where 1 = <failure_demo.test_attribute.<locals>.Foo object at 0x2adb987b5470>.b
failure_demo.py:101: AssertionError
_________________________ test_attribute_instance __________________________
@ -302,8 +302,8 @@ get on the terminal - we are working on that):
b = 1
> assert Foo().b == 2
E assert 1 == 2
E + where 1 = <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2aab6e80e400>.b
E + where <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2aab6e80e400> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
E + where 1 = <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2adb987d0390>.b
E + where <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2adb987d0390> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
failure_demo.py:107: AssertionError
__________________________ test_attribute_failure __________________________
@ -319,7 +319,7 @@ get on the terminal - we are working on that):
failure_demo.py:116:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0x2aab6e7fccc0>
self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0x2adb98822cf8>
def _get_b(self):
> raise Exception('Failed to get attrib')
@ -335,15 +335,15 @@ get on the terminal - we are working on that):
b = 2
> assert Foo().b == Bar().b
E assert 1 == 2
E + where 1 = <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2aab6e81dbe0>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2aab6e81dbe0> = <class 'failure_demo.test_attribute_multiple.<locals>.Foo'>()
E + and 2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2aab6bf55fd0>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2aab6bf55fd0> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
E + where 1 = <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2adb98841dd8>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2adb98841dd8> = <class 'failure_demo.test_attribute_multiple.<locals>.Foo'>()
E + and 2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2adb98841a90>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2adb98841a90> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
failure_demo.py:124: AssertionError
__________________________ TestRaises.test_raises __________________________
self = <failure_demo.TestRaises object at 0x2aab6e7849b0>
self = <failure_demo.TestRaises object at 0x2adb98854668>
def test_raises(self):
s = 'qwe'
@ -358,7 +358,7 @@ get on the terminal - we are working on that):
<0-codegen /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1028>:1: ValueError
______________________ TestRaises.test_raises_doesnt _______________________
self = <failure_demo.TestRaises object at 0x2aab6e8413c8>
self = <failure_demo.TestRaises object at 0x2adb988818d0>
def test_raises_doesnt(self):
> raises(IOError, "int('3')")
@ -367,7 +367,7 @@ get on the terminal - we are working on that):
failure_demo.py:136: Failed
__________________________ TestRaises.test_raise ___________________________
self = <failure_demo.TestRaises object at 0x2aab6e791fd0>
self = <failure_demo.TestRaises object at 0x2adb9885cc50>
def test_raise(self):
> raise ValueError("demo error")
@ -376,7 +376,7 @@ get on the terminal - we are working on that):
failure_demo.py:139: ValueError
________________________ TestRaises.test_tupleerror ________________________
self = <failure_demo.TestRaises object at 0x2aab6e777f60>
self = <failure_demo.TestRaises object at 0x2adb988430b8>
def test_tupleerror(self):
> a,b = [1]
@ -385,7 +385,7 @@ get on the terminal - we are working on that):
failure_demo.py:142: ValueError
______ TestRaises.test_reinterpret_fails_with_print_for_the_fun_of_it ______
self = <failure_demo.TestRaises object at 0x2aab6e7c0390>
self = <failure_demo.TestRaises object at 0x2adb9881fa20>
def test_reinterpret_fails_with_print_for_the_fun_of_it(self):
l = [1,2,3]
@ -398,7 +398,7 @@ get on the terminal - we are working on that):
l is [1, 2, 3]
________________________ TestRaises.test_some_error ________________________
self = <failure_demo.TestRaises object at 0x2aab6e83dc18>
self = <failure_demo.TestRaises object at 0x2adb98894a90>
def test_some_error(self):
> if namenotexi:
@ -426,7 +426,7 @@ get on the terminal - we are working on that):
<2-codegen 'abc-123' /home/hpk/p/pytest/doc/en/example/assertion/failure_demo.py:162>:2: AssertionError
____________________ TestMoreErrors.test_complex_error _____________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e7cd4e0>
self = <failure_demo.TestMoreErrors object at 0x2adb98812da0>
def test_complex_error(self):
def f():
@ -450,7 +450,7 @@ get on the terminal - we are working on that):
failure_demo.py:5: AssertionError
___________________ TestMoreErrors.test_z1_unpack_error ____________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e80e898>
self = <failure_demo.TestMoreErrors object at 0x2adb9884d4a8>
def test_z1_unpack_error(self):
l = []
@ -460,7 +460,7 @@ get on the terminal - we are working on that):
failure_demo.py:179: ValueError
____________________ TestMoreErrors.test_z2_type_error _____________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e7fcef0>
self = <failure_demo.TestMoreErrors object at 0x2adb987b52b0>
def test_z2_type_error(self):
l = 3
@ -470,19 +470,19 @@ get on the terminal - we are working on that):
failure_demo.py:183: TypeError
______________________ TestMoreErrors.test_startswith ______________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e7efcf8>
self = <failure_demo.TestMoreErrors object at 0x2adb988224e0>
def test_startswith(self):
s = "123"
g = "456"
> assert s.startswith(g)
E assert <built-in method startswith of str object at 0x2aab6e75d730>('456')
E + where <built-in method startswith of str object at 0x2aab6e75d730> = '123'.startswith
E assert <built-in method startswith of str object at 0x2adb987a9ca8>('456')
E + where <built-in method startswith of str object at 0x2adb987a9ca8> = '123'.startswith
failure_demo.py:188: AssertionError
__________________ TestMoreErrors.test_startswith_nested ___________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e784320>
self = <failure_demo.TestMoreErrors object at 0x2adb98836898>
def test_startswith_nested(self):
def f():
@ -490,15 +490,15 @@ get on the terminal - we are working on that):
def g():
return "456"
> assert f().startswith(g())
E assert <built-in method startswith of str object at 0x2aab6e75d730>('456')
E + where <built-in method startswith of str object at 0x2aab6e75d730> = '123'.startswith
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0x2aab6e7e8730>()
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0x2aab6e7e86a8>()
E assert <built-in method startswith of str object at 0x2adb987a9ca8>('456')
E + where <built-in method startswith of str object at 0x2adb987a9ca8> = '123'.startswith
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0x2adb9887e9d8>()
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0x2adb9887e7b8>()
failure_demo.py:195: AssertionError
_____________________ TestMoreErrors.test_global_func ______________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e8414a8>
self = <failure_demo.TestMoreErrors object at 0x2adb987b77f0>
def test_global_func(self):
> assert isinstance(globf(42), float)
@ -508,18 +508,18 @@ get on the terminal - we are working on that):
failure_demo.py:198: AssertionError
_______________________ TestMoreErrors.test_instance _______________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e75d940>
self = <failure_demo.TestMoreErrors object at 0x2adb988729b0>
def test_instance(self):
self.x = 6*7
> assert self.x != 42
E assert 42 != 42
E + where 42 = <failure_demo.TestMoreErrors object at 0x2aab6e75d940>.x
E + where 42 = <failure_demo.TestMoreErrors object at 0x2adb988729b0>.x
failure_demo.py:202: AssertionError
_______________________ TestMoreErrors.test_compare ________________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e7c0160>
self = <failure_demo.TestMoreErrors object at 0x2adb98812f98>
def test_compare(self):
> assert globf(10) < 5
@ -529,7 +529,7 @@ get on the terminal - we are working on that):
failure_demo.py:205: AssertionError
_____________________ TestMoreErrors.test_try_finally ______________________
self = <failure_demo.TestMoreErrors object at 0x2aab6e7dedd8>
self = <failure_demo.TestMoreErrors object at 0x2adb987d0198>
def test_try_finally(self):
x = 1
@ -538,4 +538,55 @@ get on the terminal - we are working on that):
E assert 1 == 0
failure_demo.py:210: AssertionError
======================== 39 failed in 0.25 seconds =========================
___________________ TestCustomAssertMsg.test_single_line ___________________
self = <failure_demo.TestCustomAssertMsg object at 0x2adb98894cc0>
def test_single_line(self):
class A:
a = 1
b = 2
> assert A.a == b, "A.a appears not to be b"
E AssertionError: A.a appears not to be b
E assert 1 == 2
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_single_line.<locals>.A'>.a
failure_demo.py:221: AssertionError
____________________ TestCustomAssertMsg.test_multiline ____________________
self = <failure_demo.TestCustomAssertMsg object at 0x2adb988414e0>
def test_multiline(self):
class A:
a = 1
b = 2
> assert A.a == b, "A.a appears not to be b\n" \
"or does not appear to be b\none of those"
E AssertionError: A.a appears not to be b
E or does not appear to be b
E one of those
E assert 1 == 2
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_multiline.<locals>.A'>.a
failure_demo.py:227: AssertionError
___________________ TestCustomAssertMsg.test_custom_repr ___________________
self = <failure_demo.TestCustomAssertMsg object at 0x2adb9885c668>
def test_custom_repr(self):
class JSON:
a = 1
def __repr__(self):
return "This is JSON\n{\n 'foo': 'bar'\n}"
a = JSON()
b = 2
> assert a.a == b, a
E AssertionError: This is JSON
E {
E 'foo': 'bar'
E }
E assert 1 == 2
E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a
failure_demo.py:237: AssertionError
======================== 42 failed in 0.29 seconds =========================

View File

@ -55,7 +55,7 @@ Let's run this without supplying our new option::
test_sample.py:6: AssertionError
--------------------------- Captured stdout call ---------------------------
first
1 failed in 0.01 seconds
1 failed in 0.02 seconds
And now with supplying a command line option::
@ -63,9 +63,9 @@ And now with supplying a command line option::
F
================================= FAILURES =================================
_______________________________ test_answer ________________________________
cmdopt = 'type2'
def test_answer(cmdopt):
if cmdopt == "type1":
print ("first")
@ -73,7 +73,7 @@ And now with supplying a command line option::
print ("second")
> assert 0 # to see what was printed
E assert 0
test_sample.py:6: AssertionError
--------------------------- Captured stdout call ---------------------------
second
@ -108,9 +108,9 @@ directory with the above conftest.py::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 0 items
============================= in 0.00 seconds =============================
.. _`excontrolskip`:
@ -152,12 +152,12 @@ and when running it will see a skipped "slow" test::
$ py.test -rs # "-rs" means report details on the little 's'
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_module.py .s
========================= short test summary info ==========================
SKIP [1] /tmp/doc-exec-87/conftest.py:9: need --runslow option to run
SKIP [1] /tmp/doc-exec-229/conftest.py:9: need --runslow option to run
=================== 1 passed, 1 skipped in 0.01 seconds ====================
@ -165,11 +165,11 @@ Or run it including the ``slow`` marked test::
$ py.test --runslow
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_module.py ..
========================= 2 passed in 0.01 seconds =========================
Writing well integrated assertion helpers
@ -256,10 +256,10 @@ which will add the string to the test header accordingly::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
project deps: mylib-1.1
collected 0 items
============================= in 0.00 seconds =============================
.. regendoc:wipe
@ -279,20 +279,20 @@ which will add info only when run with "--v"::
$ py.test -v
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
info1: did you know that ...
did you?
collecting ... collected 0 items
============================= in 0.00 seconds =============================
and nothing when run plainly::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 0 items
============================= in 0.00 seconds =============================
profiling test duration
@ -322,7 +322,7 @@ Now we can profile which test functions execute the slowest::
$ py.test --durations=3
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 3 items
test_some_are_slow.py ...
@ -330,8 +330,8 @@ Now we can profile which test functions execute the slowest::
========================= slowest 3 test durations =========================
0.20s call test_some_are_slow.py::test_funcslow2
0.10s call test_some_are_slow.py::test_funcslow1
0.00s setup test_some_are_slow.py::test_funcslow2
========================= 3 passed in 0.31 seconds =========================
0.00s teardown test_some_are_slow.py::test_funcslow1
========================= 3 passed in 0.32 seconds =========================
incremental testing - test steps
---------------------------------------------------
@ -383,7 +383,7 @@ If we run this::
$ py.test -rx
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 4 items
test_step.py .Fx.
@ -391,7 +391,7 @@ If we run this::
================================= FAILURES =================================
____________________ TestUserHandling.test_modification ____________________
self = <test_step.TestUserHandling object at 0x2ae0c339e3c8>
self = <test_step.TestUserHandling object at 0x2af9f0d94470>
def test_modification(self):
> assert 0
@ -401,7 +401,7 @@ If we run this::
========================= short test summary info ==========================
XFAIL test_step.py::TestUserHandling::()::test_deletion
reason: previous test failed (test_modification)
============== 1 failed, 2 passed, 1 xfailed in 0.02 seconds ===============
============== 1 failed, 2 passed, 1 xfailed in 0.01 seconds ===============
We'll see that ``test_deletion`` was not executed because ``test_modification``
failed. It is reported as an "expected failure".
@ -453,7 +453,7 @@ We can run this::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 7 items
test_step.py .Fx.
@ -463,17 +463,17 @@ We can run this::
================================== ERRORS ==================================
_______________________ ERROR at setup of test_root ________________________
file /tmp/doc-exec-87/b/test_error.py, line 1
file /tmp/doc-exec-229/b/test_error.py, line 1
def test_root(db): # no db here, will error out
fixture 'db' not found
available fixtures: recwarn, monkeypatch, pytestconfig, capfd, capsys, tmpdir
available fixtures: capsys, pytestconfig, monkeypatch, tmpdir, recwarn, capfd
use 'py.test --fixtures [testpath]' for help on them.
/tmp/doc-exec-87/b/test_error.py:1
/tmp/doc-exec-229/b/test_error.py:1
================================= FAILURES =================================
____________________ TestUserHandling.test_modification ____________________
self = <test_step.TestUserHandling object at 0x2ac268bf0048>
self = <test_step.TestUserHandling object at 0x2b0f0e2ff0b8>
def test_modification(self):
> assert 0
@ -482,20 +482,22 @@ We can run this::
test_step.py:9: AssertionError
_________________________________ test_a1 __________________________________
db = <conftest.DB object at 0x2ac268bf09e8>
db = <conftest.DB object at 0x2b0f0e2ff630>
def test_a1(db):
> assert 0, db # to show value
E AssertionError: <conftest.DB object at 0x2ac268bf09e8>
E AssertionError: <conftest.DB object at 0x2b0f0e2ff630>
E assert 0
a/test_db.py:2: AssertionError
_________________________________ test_a2 __________________________________
db = <conftest.DB object at 0x2ac268bf09e8>
db = <conftest.DB object at 0x2b0f0e2ff630>
def test_a2(db):
> assert 0, db # to show value
E AssertionError: <conftest.DB object at 0x2ac268bf09e8>
E AssertionError: <conftest.DB object at 0x2b0f0e2ff630>
E assert 0
a/test_db2.py:2: AssertionError
========== 3 failed, 2 passed, 1 xfailed, 1 error in 0.04 seconds ==========
@ -553,7 +555,7 @@ and run them::
$ py.test test_module.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_module.py FF
@ -561,7 +563,7 @@ and run them::
================================= FAILURES =================================
________________________________ test_fail1 ________________________________
tmpdir = local('/tmp/pytest-15/test_fail10')
tmpdir = local('/tmp/pytest-22/test_fail10')
def test_fail1(tmpdir):
> assert 0
@ -580,7 +582,7 @@ and run them::
you will have a "failures" file which contains the failing test ids::
$ cat failures
test_module.py::test_fail1 (/tmp/pytest-15/test_fail10)
test_module.py::test_fail1 (/tmp/pytest-22/test_fail10)
test_module.py::test_fail2
Making test result information available in fixtures
@ -613,10 +615,10 @@ here is a little example implemented via a local plugin::
# request.node is an "item" because we use the default
# "function" scope
if request.node.rep_setup.failed:
print "setting up a test failed!", request.node.nodeid
print ("setting up a test failed!", request.node.nodeid)
elif request.node.rep_setup.passed:
if request.node.rep_call.failed:
print "executing test failed", request.node.nodeid
print ("executing test failed", request.node.nodeid)
request.addfinalizer(fin)
@ -642,29 +644,41 @@ if you then have failing tests::
and run it::
$ py.test -s test_module.py
Traceback (most recent call last):
File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/config.py", line 513, in getconftestmodules
return self._path2confmods[path]
KeyError: local('/tmp/doc-exec-87/test_module.py')
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 3 items
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/config.py", line 537, in importconftest
return self._conftestpath2mod[conftestpath]
KeyError: local('/tmp/doc-exec-87/conftest.py')
test_module.py Esetting up a test failed! test_module.py::test_setup_fails
Fexecuting test failed test_module.py::test_call_fails
F
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/config.py", line 543, in importconftest
mod = conftestpath.pyimport()
File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/py/_path/local.py", line 640, in pyimport
__import__(modname)
File "/tmp/doc-exec-87/conftest.py", line 22
print "setting up a test failed!", request.node.nodeid
^
SyntaxError: invalid syntax
ERROR: could not load /tmp/doc-exec-87/conftest.py
================================== ERRORS ==================================
____________________ ERROR at setup of test_setup_fails ____________________
@pytest.fixture
def other():
> assert 0
E assert 0
test_module.py:6: AssertionError
================================= FAILURES =================================
_____________________________ test_call_fails ______________________________
something = None
def test_call_fails(something):
> assert 0
E assert 0
test_module.py:12: AssertionError
________________________________ test_fail2 ________________________________
def test_fail2():
> assert 0
E assert 0
test_module.py:15: AssertionError
==================== 2 failed, 1 error in 0.01 seconds =====================
You'll see that the fixture finalizers could use the precise reporting
information.

View File

@ -76,7 +76,7 @@ marked ``smtp`` fixture function. Running the test looks like this::
$ py.test test_smtpsimple.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_smtpsimple.py F
@ -84,7 +84,7 @@ marked ``smtp`` fixture function. Running the test looks like this::
================================= FAILURES =================================
________________________________ test_ehlo _________________________________
smtp = <smtplib.SMTP object at 0x2aed2eae9da0>
smtp = <smtplib.SMTP object at 0x2b040fa62128>
def test_ehlo(smtp):
response, msg = smtp.ehlo()
@ -93,7 +93,7 @@ marked ``smtp`` fixture function. Running the test looks like this::
E TypeError: Type str doesn't support the buffer API
test_smtpsimple.py:11: TypeError
========================= 1 failed in 0.21 seconds =========================
========================= 1 failed in 0.20 seconds =========================
In the failure traceback we see that the test function was called with a
``smtp`` argument, the ``smtplib.SMTP()`` instance created by the fixture
@ -193,7 +193,7 @@ inspect what is going on and can now run the tests::
$ py.test test_module.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_module.py FF
@ -201,7 +201,7 @@ inspect what is going on and can now run the tests::
================================= FAILURES =================================
________________________________ test_ehlo _________________________________
smtp = <smtplib.SMTP object at 0x2b1a170a7240>
smtp = <smtplib.SMTP object at 0x2abe3c757208>
def test_ehlo(smtp):
response = smtp.ehlo()
@ -212,7 +212,7 @@ inspect what is going on and can now run the tests::
test_module.py:5: TypeError
________________________________ test_noop _________________________________
smtp = <smtplib.SMTP object at 0x2b1a170a7240>
smtp = <smtplib.SMTP object at 0x2abe3c757208>
def test_noop(smtp):
response = smtp.noop()
@ -221,7 +221,7 @@ inspect what is going on and can now run the tests::
E assert 0
test_module.py:11: AssertionError
========================= 2 failed in 0.21 seconds =========================
========================= 2 failed in 0.17 seconds =========================
You see the two ``assert 0`` failing and more importantly you can also see
that the same (module-scoped) ``smtp`` object was passed into the two
@ -331,6 +331,7 @@ Running it::
test_anothersmtp.py:5: in test_showhelo
assert 0, smtp.helo()
E AssertionError: (250, b'mail.python.org')
E assert 0
voila! The ``smtp`` fixture function picked up our mail server name
from the module namespace.
@ -377,7 +378,7 @@ So let's just do another run::
================================= FAILURES =================================
__________________________ test_ehlo[merlinux.eu] __________________________
smtp = <smtplib.SMTP object at 0x2abe2d35dac8>
smtp = <smtplib.SMTP object at 0x2afbf4496828>
def test_ehlo(smtp):
response = smtp.ehlo()
@ -388,7 +389,7 @@ So let's just do another run::
test_module.py:5: TypeError
__________________________ test_noop[merlinux.eu] __________________________
smtp = <smtplib.SMTP object at 0x2abe2d35dac8>
smtp = <smtplib.SMTP object at 0x2afbf4496828>
def test_noop(smtp):
response = smtp.noop()
@ -399,7 +400,7 @@ So let's just do another run::
test_module.py:11: AssertionError
________________________ test_ehlo[mail.python.org] ________________________
smtp = <smtplib.SMTP object at 0x2abe2d35d9b0>
smtp = <smtplib.SMTP object at 0x2afbf4496d68>
def test_ehlo(smtp):
response = smtp.ehlo()
@ -409,10 +410,10 @@ So let's just do another run::
test_module.py:5: TypeError
-------------------------- Captured stdout setup ---------------------------
finalizing <smtplib.SMTP object at 0x2abe2d35dac8>
finalizing <smtplib.SMTP object at 0x2afbf4496828>
________________________ test_noop[mail.python.org] ________________________
smtp = <smtplib.SMTP object at 0x2abe2d35d9b0>
smtp = <smtplib.SMTP object at 0x2afbf4496d68>
def test_noop(smtp):
response = smtp.noop()
@ -421,7 +422,7 @@ So let's just do another run::
E assert 0
test_module.py:11: AssertionError
4 failed in 6.37 seconds
4 failed in 6.02 seconds
We see that our two test functions each ran twice, against the different
``smtp`` instances. Note also, that with the ``mail.python.org``
@ -461,13 +462,13 @@ Here we declare an ``app`` fixture which receives the previously defined
$ py.test -v test_appsetup.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 2 items
test_appsetup.py::test_smtp_exists[merlinux.eu] PASSED
test_appsetup.py::test_smtp_exists[mail.python.org] PASSED
========================= 2 passed in 6.37 seconds =========================
========================= 2 passed in 5.45 seconds =========================
Due to the parametrization of ``smtp`` the test will run twice with two
different ``App`` instances and respective smtp servers. There is no
@ -525,7 +526,7 @@ Let's run the tests in verbose mode and with looking at the print-output::
$ py.test -v -s test_module.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
collecting ... collected 8 items
test_module.py::test_0[1] test0 1
@ -675,7 +676,7 @@ If we run it, we get two passing tests::
$ py.test -q
..
2 passed in 0.02 seconds
2 passed in 0.01 seconds
Here is how autouse fixtures work in other scopes:

View File

@ -27,7 +27,7 @@ Installation options::
To check your installation has installed the correct version::
$ py.test --version
This is pytest version 2.6.2, imported from /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/pytest.py
This is pytest version 2.6.3, imported from /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/pytest.py
If you get an error checkout :ref:`installation issues`.
@ -49,7 +49,7 @@ That's it. You can execute the test function now::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_sample.py F
@ -97,7 +97,7 @@ Running it with, this time in "quiet" reporting mode::
$ py.test -q test_sysexit.py
.
1 passed in 0.01 seconds
1 passed in 0.00 seconds
.. todo:: For further ways to assert exceptions see the `raises`
@ -127,7 +127,7 @@ run the module by passing its filename::
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________
self = <test_class.TestClass object at 0x2aef2750f4a8>
self = <test_class.TestClass object at 0x2b39478f7438>
def test_two(self):
x = "hello"
@ -135,7 +135,7 @@ run the module by passing its filename::
E assert hasattr('hello', 'check')
test_class.py:8: AssertionError
1 failed, 1 passed in 0.02 seconds
1 failed, 1 passed in 0.01 seconds
The first test passed, the second failed. Again we can easily see
the intermediate values used in the assertion, helping us to
@ -163,7 +163,7 @@ before performing the test function call. Let's just run it::
================================= FAILURES =================================
_____________________________ test_needsfiles ______________________________
tmpdir = local('/tmp/pytest-11/test_needsfiles0')
tmpdir = local('/tmp/pytest-18/test_needsfiles0')
def test_needsfiles(tmpdir):
print (tmpdir)
@ -172,8 +172,8 @@ before performing the test function call. Let's just run it::
test_tmpdir.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-11/test_needsfiles0
1 failed in 0.32 seconds
/tmp/pytest-18/test_needsfiles0
1 failed in 0.01 seconds
Before the test runs, a unique-per-test-invocation temporary directory
was created. More info at :ref:`tmpdir handling`.

View File

@ -53,7 +53,7 @@ them in turn::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 3 items
test_expectation.py ..F
@ -100,12 +100,12 @@ Let's run this::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 3 items
test_expectation.py ..x
=================== 2 passed, 1 xfailed in 0.01 seconds ====================
=================== 2 passed, 1 xfailed in 0.02 seconds ====================
The one parameter set which caused a failure previously now
shows up as an "xfailed (expected to fail)" test.
@ -170,8 +170,8 @@ Let's also run with a stringinput that will lead to a failing test::
def test_valid_string(stringinput):
> assert stringinput.isalpha()
E assert <built-in method isalpha of str object at 0x2adc310adb58>()
E + where <built-in method isalpha of str object at 0x2adc310adb58> = '!'.isalpha
E assert <built-in method isalpha of str object at 0x2b1c6de5bb20>()
E + where <built-in method isalpha of str object at 0x2b1c6de5bb20> = '!'.isalpha
test_strings.py:3: AssertionError
1 failed in 0.01 seconds
@ -185,7 +185,7 @@ listlist::
$ py.test -q -rs test_strings.py
s
========================= short test summary info ==========================
SKIP [1] /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1139: got empty parameter set, function test_valid_string at /tmp/doc-exec-38/test_strings.py:1
SKIP [1] /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1139: got empty parameter set, function test_valid_string at /tmp/doc-exec-180/test_strings.py:1
1 skipped in 0.01 seconds
For further examples, you might want to look at :ref:`more

View File

@ -164,7 +164,7 @@ Running it with the report-on-xfail option gives this output::
example $ py.test -rx xfail_demo.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 7 items
xfail_demo.py xxxxxxx

View File

@ -29,7 +29,7 @@ Running this would result in a passed test except for the last
$ py.test test_tmpdir.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 1 items
test_tmpdir.py F
@ -37,7 +37,7 @@ Running this would result in a passed test except for the last
================================= FAILURES =================================
_____________________________ test_create_file _____________________________
tmpdir = local('/tmp/pytest-12/test_create_file0')
tmpdir = local('/tmp/pytest-19/test_create_file0')
def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt")

View File

@ -88,7 +88,7 @@ the ``self.db`` values in the traceback::
$ py.test test_unittest_db.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.24 -- pytest-2.6.2
platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3
collected 2 items
test_unittest_db.py FF
@ -101,7 +101,8 @@ the ``self.db`` values in the traceback::
def test_method1(self):
assert hasattr(self, "db")
> assert 0, self.db # fail for demo purposes
E AssertionError: <conftest.db_class.<locals>.DummyDB object at 0x2ad7f12df240>
E AssertionError: <conftest.db_class.<locals>.DummyDB object at 0x2b938b865208>
E assert 0
test_unittest_db.py:9: AssertionError
___________________________ MyTest.test_method2 ____________________________
@ -110,7 +111,8 @@ the ``self.db`` values in the traceback::
def test_method2(self):
> assert 0, self.db # fail for demo purposes
E AssertionError: <conftest.db_class.<locals>.DummyDB object at 0x2ad7f12df240>
E AssertionError: <conftest.db_class.<locals>.DummyDB object at 0x2b938b865208>
E assert 0
test_unittest_db.py:12: AssertionError
========================= 2 failed in 0.05 seconds =========================
@ -160,7 +162,7 @@ Running this test module ...::
$ py.test -q test_unittest_cleandir.py
.
1 passed in 0.04 seconds
1 passed in 0.05 seconds
... gives us one passed test because the ``initdir`` fixture function
was executed ahead of the ``test_method``.

View File

@ -17,7 +17,7 @@ long_description = open('README.rst').read()
def main():
install_requires = ['py>=1.4.25.dev2']
install_requires = ['py>=1.4.25']
if sys.version_info < (2, 7) or (3,) <= sys.version_info < (3, 2):
install_requires.append('argparse')
if sys.platform == 'win32':
@ -27,7 +27,7 @@ def main():
name='pytest',
description='pytest: simple powerful testing with Python',
long_description=long_description,
version='2.6.3.dev3',
version='2.6.3',
url='http://pytest.org',
license='MIT license',
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],