bump verrsion to python2.7, fix a too precise test for windows, regen docs

This commit is contained in:
holger krekel 2015-03-26 09:34:10 +01:00
parent c69978fbb0
commit d2a8866bce
25 changed files with 385 additions and 583 deletions

View File

@ -1,4 +1,4 @@
2.7.0.dev (compared to 2.6.4)
2.7.0 (compared to 2.6.4)
-----------------------------
- fix issue435: make reload() work when assert rewriting is active.
@ -47,6 +47,8 @@
is scheduled to drop supporting the old ``__multicall__``
and only support the hookwrapper protocol.
- majorly speed up invocation of plugin hooks
- use hookwrapper mechanism in builtin pytest plugins.
- add a doctest ini option for doctest flags, thanks Holger Peters.

View File

@ -1,2 +1,2 @@
#
__version__ = '2.7.0.dev1'
__version__ = '2.7.0'

View File

@ -0,0 +1,101 @@
pytest-2.7.0: fixes, features, speed 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 supposed to be drop-in compatible to 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:
Anatoly Bubenkoff
Floris Bruynooghe
Brianna Laugher
Eric Siegerman
Daniel Hahler
Charles Cloud
Tom Viner
Holger Peters
Ldiary Translations
almarklein
have fun,
holger krekel
2.7.0 (compared to 2.6.4)
-----------------------------
- fix issue435: make reload() work when assert rewriting is active.
Thanks Daniel Hahler.
- fix issue616: conftest.py files and their contained fixutres are now
properly considered for visibility, independently from the exact
current working directory and test arguments that are used.
Many thanks to Eric Siegerman and his PR235 which contains
systematic tests for conftest visibility and now passes.
This change also introduces the concept of a ``rootdir`` which
is printed as a new pytest header and documented in the pytest
customize web page.
- change reporting of "diverted" tests, i.e. tests that are collected
in one file but actually come from another (e.g. when tests in a test class
come from a base class in a different file). We now show the nodeid
and indicate via a postfix the other file.
- add ability to set command line options by environment variable PYTEST_ADDOPTS.
- added documentation on the new pytest-dev teams on bitbucket and
github. See https://pytest.org/latest/contributing.html .
Thanks to Anatoly for pushing and initial work on this.
- fix issue650: new option ``--docttest-ignore-import-errors`` which
will turn import errors in doctests into skips. Thanks Charles Cloud
for the complete PR.
- fix issue655: work around different ways that cause python2/3
to leak sys.exc_info into fixtures/tests causing failures in 3rd party code
- fix issue615: assertion re-writing did not correctly escape % signs
when formatting boolean operations, which tripped over mixing
booleans with modulo operators. Thanks to Tom Viner for the report,
triaging and fix.
- implement issue351: add ability to specify parametrize ids as a callable
to generate custom test ids. Thanks Brianna Laugher for the idea and
implementation.
- introduce and document new hookwrapper mechanism useful for plugins
which want to wrap the execution of certain hooks for their purposes.
This supersedes the undocumented ``__multicall__`` protocol which
pytest itself and some external plugins use. Note that pytest-2.8
is scheduled to drop supporting the old ``__multicall__``
and only support the hookwrapper protocol.
- majorly speed up invocation of plugin hooks
- use hookwrapper mechanism in builtin pytest plugins.
- add a doctest ini option for doctest flags, thanks Holger Peters.
- add note to docs that if you want to mark a parameter and the
parameter is a callable, you also need to pass in a reason to disambiguate
it from the "decorator" case. Thanks Tom Viner.
- "python_classes" and "python_functions" options now support glob-patterns
for test discovery, as discussed in issue600. Thanks Ldiary Translations.
- allow to override parametrized fixtures with non-parametrized ones and vice versa (bubenkoff).
- fix issue463: raise specific error for 'parameterize' misspelling (pfctdayelise).
- On failure, the ``sys.last_value``, ``sys.last_type`` and
``sys.last_traceback`` are set, so that a user can inspect the error
via postmortem debugging (almarklein).

View File

@ -26,7 +26,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-98, inifile:
collected 1 items
test_assert1.py F
@ -135,7 +136,8 @@ if you run this module::
$ py.test test_assert2.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-98, inifile:
collected 1 items
test_assert2.py F
@ -202,16 +204,16 @@ the conftest file::
F
================================= FAILURES =================================
_______________________________ test_compare _______________________________
def test_compare():
f1 = Foo(1)
f2 = Foo(2)
> assert f1 == f2
E assert Comparing Foo instances:
E vals: 1 != 2
test_foocompare.py:8: AssertionError
1 failed in 0.01 seconds
1 failed in 0.00 seconds
.. _assert-details:
.. _`assert introspection`:

View File

@ -77,12 +77,10 @@ You can ask for available builtin or project-custom
enables capturing of writes to sys.stdout/sys.stderr and makes
captured output available via ``capsys.readouterr()`` method calls
which return a ``(out, err)`` tuple.
capfd
enables capturing of writes to file descriptors 1 and 2 and makes
captured output available via ``capfd.readouterr()`` method calls
which return a ``(out, err)`` tuple.
monkeypatch
The returned ``monkeypatch`` funcarg provides these
helper methods to modify objects, dictionaries or os.environ::
@ -100,7 +98,6 @@ You can ask for available builtin or project-custom
test function has finished. The ``raising``
parameter determines if a KeyError or AttributeError
will be raised if the set/deletion operation has no target.
pytestconfig
the pytest config object with access to command line opts.
recwarn
@ -111,13 +108,11 @@ You can ask for available builtin or project-custom
See http://docs.python.org/library/warnings.html for information
on warning categories.
tmpdir
return a temporary directory path object
which is unique to each test function invocation,
created as a sub directory of the base temporary
directory. The returned object is a `py.path.local`_
path object.
in 0.00 seconds

View File

@ -64,7 +64,8 @@ of the failing function and hide the other one::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-101, inifile:
collected 2 items
test_module.py .F
@ -78,7 +79,7 @@ of the failing function and hide the other one::
test_module.py:9: AssertionError
-------------------------- Captured stdout setup ---------------------------
setting up <function test_func2 at 0x2af94bea1d08>
setting up <function test_func2 at 0x2b24d5259158>
==================== 1 failed, 1 passed in 0.01 seconds ====================
Accessing captured output from a test function

View File

@ -17,8 +17,8 @@
#
# The full version, including alpha/beta/rc tags.
# The short X.Y version.
version = "2.6"
release = "2.6.4"
version = "2.7"
release = "2.7.0"
import sys, os

View File

@ -44,12 +44,13 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-107, inifile: pytest.ini
collected 1 items
mymodule.py .
========================= 1 passed in 0.06 seconds =========================
========================= 1 passed in 0.05 seconds =========================
It is possible to use fixtures using the ``getfixture`` helper::

View File

@ -31,7 +31,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 4 items
test_server.py::test_send_http PASSED
@ -43,7 +44,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 4 items
test_server.py::test_something_quick PASSED
@ -62,7 +64,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 5 items
test_server.py::TestClass::test_method PASSED
@ -73,7 +76,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 4 items
test_server.py::TestClass::test_method PASSED
@ -84,7 +88,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 8 items
test_server.py::TestClass::test_method PASSED
@ -120,7 +125,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 4 items
test_server.py::test_send_http PASSED
@ -132,7 +138,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 4 items
test_server.py::test_something_quick PASSED
@ -146,7 +153,8 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-167, inifile:
collecting ... collected 4 items
test_server.py::test_send_http PASSED
@ -334,23 +342,25 @@ the test needs::
$ py.test -E stage2
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-167, inifile:
collected 1 items
test_someenv.py s
======================== 1 skipped in 0.01 seconds =========================
======================== 1 skipped in 0.00 seconds =========================
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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-167, inifile:
collected 1 items
test_someenv.py .
========================= 1 passed in 0.01 seconds =========================
========================= 1 passed in 0.00 seconds =========================
The ``--markers`` option always gives you a list of available markers::
@ -463,12 +473,13 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-167, inifile:
collected 4 items
test_plat.py sss.
========================= short test summary info ==========================
SKIP [3] /tmp/doc-exec-68/conftest.py:12: cannot run on platform linux
SKIP [3] /tmp/doc-exec-167/conftest.py:12: cannot run on platform linux
=================== 1 passed, 3 skipped in 0.01 seconds ====================
@ -476,7 +487,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-167, inifile:
collected 4 items
test_plat.py s
@ -527,7 +539,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-167, inifile:
collected 4 items
test_module.py FF
@ -548,7 +561,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-167, inifile:
collected 4 items
test_module.py FFF

View File

@ -5,7 +5,7 @@ serialization via the pickle module.
import py
import pytest
pythonlist = ['python2.6', 'python2.7', 'python3.4']
pythonlist = ['python2.6', 'python2.7', 'python3.3']
@pytest.fixture(params=pythonlist)
def python1(request, tmpdir):
picklefile = tmpdir.join("data.pickle")
@ -26,7 +26,7 @@ class Python:
dumpfile.write(py.code.Source("""
import pickle
f = open(%r, 'wb')
s = pickle.dump(%r, f)
s = pickle.dump(%r, f, protocol=2)
f.close()
""" % (str(self.picklefile), obj)))
py.process.cmdexec("%s %s" %(self.pythonpath, dumpfile))

View File

@ -27,7 +27,8 @@ now execute the test specification::
nonpython $ py.test test_simple.yml
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /home/hpk/p/pytest/doc/en, inifile: pytest.ini
collected 2 items
test_simple.yml F.
@ -56,11 +57,12 @@ consulted when reporting in ``verbose`` mode::
nonpython $ py.test -v
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /home/hpk/p/pytest/doc/en, inifile: pytest.ini
collecting ... collected 2 items
test_simple.yml::usecase: hello FAILED
test_simple.yml::usecase: ok PASSED
test_simple.yml::hello FAILED
test_simple.yml::ok PASSED
================================= FAILURES =================================
______________________________ usecase: hello ______________________________
@ -74,9 +76,10 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /home/hpk/p/pytest/doc/en, inifile: pytest.ini
collected 2 items
<YamlFile 'test_simple.yml'>
<YamlFile 'example/nonpython/test_simple.yml'>
<YamlItem 'hello'>
<YamlItem 'ok'>

View File

@ -126,22 +126,12 @@ objects, they are still using the default pytest representation::
$ py.test test_time.py --collect-only
============================ test session starts =============================
platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.6.0.dev1
plugins: cache
collected 6 items
<Module 'test_time.py'>
<Function 'test_timedistance_v0[a0-b0-expected0]'>
<Function 'test_timedistance_v0[a1-b1-expected1]'>
<Function 'test_timedistance_v1[forward]'>
<Function 'test_timedistance_v1[backward]'>
<Function 'test_timedistance_v2[20011212-20011211-expected0]'>
<Function 'test_timedistance_v2[20011211-20011212-expected1]'>
============================== in 0.04 seconds ===============================
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-169, inifile:
============================= in 0.00 seconds =============================
ERROR: file not found: test_time.py
A quick port of "testscenarios"
------------------------------------
@ -181,7 +171,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-169, inifile:
collected 4 items
test_scenarios.py ....
@ -193,7 +184,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-169, inifile:
collected 4 items
<Module 'test_scenarios.py'>
<Class 'TestSampleWithScenarios'>
@ -257,7 +249,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-169, inifile:
collected 2 items
<Module 'test_backends.py'>
<Function 'test_db_initialized[d1]'>
@ -272,7 +265,7 @@ And then when we run the test::
================================= FAILURES =================================
_________________________ test_db_initialized[d2] __________________________
db = <conftest.DB2 object at 0x2b04d7936be0>
db = <conftest.DB2 object at 0x2b160a531f98>
def test_db_initialized(db):
# a dummy test
@ -326,9 +319,9 @@ 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 0x2af4cdee0da0>, a = 1, b = 2
self = <test_parametrize.TestClass object at 0x2ab66352a978>, a = 1, b = 2
def test_equals(self, a, b):
> assert a == b
@ -354,345 +347,8 @@ 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
..................FFFFFF...
================================= FAILURES =================================
________________ test_basic_objects[python3.4-python2.6-42] ________________
python1 = <multipython.Python object at 0x2afc7d8c2828>
python2 = <multipython.Python object at 0x2afc7d8c2588>, 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-111/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-111/test_basic_objects_python3_4_p0/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-111/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-111/test_basic_objects_python3_4_p0/load.py
_______________ test_basic_objects[python3.4-python2.6-obj1] _______________
python1 = <multipython.Python object at 0x2afc7d8b8c88>
python2 = <multipython.Python object at 0x2afc7d8b8e48>, 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-111/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-111/test_basic_objects_python3_4_p1/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-111/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-111/test_basic_objects_python3_4_p1/load.py
_______________ test_basic_objects[python3.4-python2.6-obj2] _______________
python1 = <multipython.Python object at 0x2afc7d8bf6d8>
python2 = <multipython.Python object at 0x2afc7d8bf860>, 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-111/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-111/test_basic_objects_python3_4_p2/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-111/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-111/test_basic_objects_python3_4_p2/load.py
________________ test_basic_objects[python3.4-python2.7-42] ________________
python1 = <multipython.Python object at 0x2afc7d8b8710>
python2 = <multipython.Python object at 0x2afc7d8b8748>, 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/venv/0/bin/python2.7 /tmp/pytest-111/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/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p3/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-111/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-111/test_basic_objects_python3_4_p3/load.py
_______________ test_basic_objects[python3.4-python2.7-obj1] _______________
python1 = <multipython.Python object at 0x2afc7d8bfb38>
python2 = <multipython.Python object at 0x2afc7d8bf3c8>, 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/venv/0/bin/python2.7 /tmp/pytest-111/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/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p4/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-111/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-111/test_basic_objects_python3_4_p4/load.py
_______________ test_basic_objects[python3.4-python2.7-obj2] _______________
python1 = <multipython.Python object at 0x2afc7d8b86a0>
python2 = <multipython.Python object at 0x2afc7d8c2a90>, 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/venv/0/bin/python2.7 /tmp/pytest-111/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/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p5/load.py
E Traceback (most recent call last):
E File "/tmp/pytest-111/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-111/test_basic_objects_python3_4_p5/load.py
6 failed, 21 passed in 1.66 seconds
...........................
27 passed in 1.70 seconds
Indirect parametrization of optional implementations/imports
--------------------------------------------------------------------
@ -739,12 +395,13 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-169, inifile:
collected 2 items
test_module.py .s
========================= short test summary info ==========================
SKIP [1] /tmp/doc-exec-70/conftest.py:10: could not import 'opt2'
SKIP [1] /tmp/doc-exec-169/conftest.py:10: could not import 'opt2'
=================== 1 passed, 1 skipped in 0.01 seconds ====================

View File

@ -43,7 +43,8 @@ then the test collection looks like this::
$ py.test --collect-only
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-170, inifile: setup.cfg
collected 2 items
<Module 'check_myapp.py'>
<Class 'CheckMyApp'>
@ -88,9 +89,10 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /home/hpk/p/pytest/doc/en, inifile: pytest.ini
collected 3 items
<Module 'pythoncollection.py'>
<Module 'example/pythoncollection.py'>
<Function 'test_function'>
<Class 'TestClass'>
<Instance '()'>
@ -141,7 +143,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-170, inifile: pytest.ini
collected 0 items
============================= in 0.00 seconds =============================

View File

@ -13,7 +13,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /home/hpk/p/pytest/doc/en, inifile: pytest.ini
collected 42 items
failure_demo.py FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@ -30,7 +31,7 @@ get on the terminal - we are working on that):
failure_demo.py:15: AssertionError
_________________________ TestFailing.test_simple __________________________
self = <failure_demo.TestFailing object at 0x2b4436e4d390>
self = <failure_demo.TestFailing object at 0x2b186edcf6a0>
def test_simple(self):
def f():
@ -40,13 +41,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 0x2b4436f1e6a8>()
E + and 43 = <function TestFailing.test_simple.<locals>.g at 0x2b4436f1e7b8>()
E + where 42 = <function TestFailing.test_simple.<locals>.f at 0x2b186edd09d8>()
E + and 43 = <function TestFailing.test_simple.<locals>.g at 0x2b186edd9950>()
failure_demo.py:28: AssertionError
____________________ TestFailing.test_simple_multiline _____________________
self = <failure_demo.TestFailing object at 0x2b4436f167b8>
self = <failure_demo.TestFailing object at 0x2b186e2942e8>
def test_simple_multiline(self):
otherfunc_multi(
@ -66,19 +67,19 @@ get on the terminal - we are working on that):
failure_demo.py:11: AssertionError
___________________________ TestFailing.test_not ___________________________
self = <failure_demo.TestFailing object at 0x2b4436f12668>
self = <failure_demo.TestFailing object at 0x2b186e270630>
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 0x2b4436f1ebf8>()
E + where 42 = <function TestFailing.test_not.<locals>.f at 0x2b186edd99d8>()
failure_demo.py:38: AssertionError
_________________ TestSpecialisedExplanations.test_eq_text _________________
self = <failure_demo.TestSpecialisedExplanations object at 0x2b4436efaba8>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186eea7048>
def test_eq_text(self):
> assert 'spam' == 'eggs'
@ -89,7 +90,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 0x2b4436ee02e8>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ed9aa58>
def test_eq_similar_text(self):
> assert 'foo 1 bar' == 'foo 2 bar'
@ -102,7 +103,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 0x2b4436ed5e48>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ee904a8>
def test_eq_multiline_text(self):
> assert 'foo\nspam\nbar' == 'foo\neggs\nbar'
@ -115,7 +116,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 0x2b4436ed2240>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ee8d828>
def test_eq_long_text(self):
a = '1'*100 + 'a' + '2'*100
@ -132,7 +133,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 0x2b4436f18780>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186e28cb00>
def test_eq_long_text_multiline(self):
a = '1\n'*100 + 'a' + '2\n'*100
@ -156,7 +157,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 0x2b4436e42b00>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ee879b0>
def test_eq_list(self):
> assert [0, 1, 2] == [0, 1, 3]
@ -167,7 +168,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 0x2b4436f164e0>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186e28eb70>
def test_eq_list_long(self):
a = [0]*100 + [1] + [3]*100
@ -180,7 +181,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 0x2b4436f12c50>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ee78860>
def test_eq_dict(self):
> assert {'a': 0, 'b': 1, 'c': 0} == {'a': 0, 'b': 2, 'd': 0}
@ -197,7 +198,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 0x2b4436ec1208>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186eea6588>
def test_eq_set(self):
> assert set([0, 10, 11, 12]) == set([0, 20, 21])
@ -214,7 +215,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 0x2b4436efab70>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ecbdc50>
def test_eq_longer_list(self):
> assert [1,2] == [1,2,3]
@ -225,7 +226,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 0x2b4436d73278>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186eeb0518>
def test_in_list(self):
> assert 1 in [0, 2, 3, 4, 5]
@ -234,7 +235,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 0x2b4436ebfac8>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186eeb1860>
def test_not_in_text_multiline(self):
text = 'some multiline\ntext\nwhich\nincludes foo\nand a\ntail'
@ -252,7 +253,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 0x2b4436ee0898>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ee9e4a8>
def test_not_in_text_single(self):
text = 'single foo line'
@ -265,7 +266,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 0x2b4436ed5748>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186eea6908>
def test_not_in_text_single_long(self):
text = 'head ' * 50 + 'foo ' + 'tail ' * 20
@ -278,7 +279,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 0x2b4436e4db70>
self = <failure_demo.TestSpecialisedExplanations object at 0x2b186ee908d0>
def test_not_in_text_single_long_term(self):
text = 'head ' * 50 + 'f'*70 + 'tail ' * 20
@ -297,7 +298,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 0x2b4436e42ac8>.b
E + where 1 = <failure_demo.test_attribute.<locals>.Foo object at 0x2b186ee8d4e0>.b
failure_demo.py:101: AssertionError
_________________________ test_attribute_instance __________________________
@ -307,8 +308,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 0x2b4436f185c0>.b
E + where <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2b4436f185c0> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
E + where 1 = <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2b186eea6240>.b
E + where <failure_demo.test_attribute_instance.<locals>.Foo object at 0x2b186eea6240> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
failure_demo.py:107: AssertionError
__________________________ test_attribute_failure __________________________
@ -324,7 +325,7 @@ get on the terminal - we are working on that):
failure_demo.py:116:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0x2b4436f16a58>
self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0x2b186ed9a4e0>
def _get_b(self):
> raise Exception('Failed to get attrib')
@ -340,15 +341,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 0x2b4436f12a90>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2b4436f12a90> = <class 'failure_demo.test_attribute_multiple.<locals>.Foo'>()
E + and 2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2b4436f12ac8>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2b4436f12ac8> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
E + where 1 = <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2b186ee78630>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Foo object at 0x2b186ee78630> = <class 'failure_demo.test_attribute_multiple.<locals>.Foo'>()
E + and 2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2b186ee78358>.b
E + where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0x2b186ee78358> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
failure_demo.py:124: AssertionError
__________________________ TestRaises.test_raises __________________________
self = <failure_demo.TestRaises object at 0x2b4436ec1d68>
self = <failure_demo.TestRaises object at 0x2b186e270b38>
def test_raises(self):
s = 'qwe'
@ -360,10 +361,10 @@ get on the terminal - we are working on that):
> int(s)
E ValueError: invalid literal for int() with base 10: 'qwe'
<0-codegen /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1028>:1: ValueError
<0-codegen /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1075>:1: ValueError
______________________ TestRaises.test_raises_doesnt _______________________
self = <failure_demo.TestRaises object at 0x2b4436ee9860>
self = <failure_demo.TestRaises object at 0x2b186eeab2b0>
def test_raises_doesnt(self):
> raises(IOError, "int('3')")
@ -372,7 +373,7 @@ get on the terminal - we are working on that):
failure_demo.py:136: Failed
__________________________ TestRaises.test_raise ___________________________
self = <failure_demo.TestRaises object at 0x2b4436ed5198>
self = <failure_demo.TestRaises object at 0x2b186ee75358>
def test_raise(self):
> raise ValueError("demo error")
@ -381,7 +382,7 @@ get on the terminal - we are working on that):
failure_demo.py:139: ValueError
________________________ TestRaises.test_tupleerror ________________________
self = <failure_demo.TestRaises object at 0x2b4436ebf320>
self = <failure_demo.TestRaises object at 0x2b186e285978>
def test_tupleerror(self):
> a,b = [1]
@ -390,7 +391,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 0x2b4436f1c6d8>
self = <failure_demo.TestRaises object at 0x2b186edcfe48>
def test_reinterpret_fails_with_print_for_the_fun_of_it(self):
l = [1,2,3]
@ -403,7 +404,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 0x2b4436e6abe0>
self = <failure_demo.TestRaises object at 0x2b186eeb1898>
def test_some_error(self):
> if namenotexi:
@ -431,7 +432,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 0x2b4436ee59e8>
self = <failure_demo.TestMoreErrors object at 0x2b186e270358>
def test_complex_error(self):
def f():
@ -455,7 +456,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 0x2b4436f1a940>
self = <failure_demo.TestMoreErrors object at 0x2b186ecbdba8>
def test_z1_unpack_error(self):
l = []
@ -465,7 +466,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 0x2b4436ef1ef0>
self = <failure_demo.TestMoreErrors object at 0x2b186ee78550>
def test_z2_type_error(self):
l = 3
@ -475,19 +476,19 @@ get on the terminal - we are working on that):
failure_demo.py:183: TypeError
______________________ TestMoreErrors.test_startswith ______________________
self = <failure_demo.TestMoreErrors object at 0x2b4436f16710>
self = <failure_demo.TestMoreErrors object at 0x2b186ee90978>
def test_startswith(self):
s = "123"
g = "456"
> assert s.startswith(g)
E assert <built-in method startswith of str object at 0x2b4436e42ea0>('456')
E + where <built-in method startswith of str object at 0x2b4436e42ea0> = '123'.startswith
E assert <built-in method startswith of str object at 0x2b186eea6500>('456')
E + where <built-in method startswith of str object at 0x2b186eea6500> = '123'.startswith
failure_demo.py:188: AssertionError
__________________ TestMoreErrors.test_startswith_nested ___________________
self = <failure_demo.TestMoreErrors object at 0x2b4436f18c88>
self = <failure_demo.TestMoreErrors object at 0x2b186eeab358>
def test_startswith_nested(self):
def f():
@ -495,15 +496,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 0x2b4436e42ea0>('456')
E + where <built-in method startswith of str object at 0x2b4436e42ea0> = '123'.startswith
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0x2b4436f1e950>()
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0x2b4436f1e840>()
E assert <built-in method startswith of str object at 0x2b186eea6500>('456')
E + where <built-in method startswith of str object at 0x2b186eea6500> = '123'.startswith
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0x2b186eea1510>()
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0x2b186eea1268>()
failure_demo.py:195: AssertionError
_____________________ TestMoreErrors.test_global_func ______________________
self = <failure_demo.TestMoreErrors object at 0x2b4436eed0f0>
self = <failure_demo.TestMoreErrors object at 0x2b186e28c7f0>
def test_global_func(self):
> assert isinstance(globf(42), float)
@ -513,18 +514,18 @@ get on the terminal - we are working on that):
failure_demo.py:198: AssertionError
_______________________ TestMoreErrors.test_instance _______________________
self = <failure_demo.TestMoreErrors object at 0x2b4436e67c50>
self = <failure_demo.TestMoreErrors object at 0x2b186ee759b0>
def test_instance(self):
self.x = 6*7
> assert self.x != 42
E assert 42 != 42
E + where 42 = <failure_demo.TestMoreErrors object at 0x2b4436e67c50>.x
E + where 42 = <failure_demo.TestMoreErrors object at 0x2b186ee759b0>.x
failure_demo.py:202: AssertionError
_______________________ TestMoreErrors.test_compare ________________________
self = <failure_demo.TestMoreErrors object at 0x2b4436ebf668>
self = <failure_demo.TestMoreErrors object at 0x2b186ecbdf60>
def test_compare(self):
> assert globf(10) < 5
@ -534,7 +535,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 0x2b4436edf588>
self = <failure_demo.TestMoreErrors object at 0x2b186eeb1e48>
def test_try_finally(self):
x = 1
@ -545,7 +546,7 @@ get on the terminal - we are working on that):
failure_demo.py:210: AssertionError
___________________ TestCustomAssertMsg.test_single_line ___________________
self = <failure_demo.TestCustomAssertMsg object at 0x2b4436ed5128>
self = <failure_demo.TestCustomAssertMsg object at 0x2b186ed9a748>
def test_single_line(self):
class A:
@ -559,7 +560,7 @@ get on the terminal - we are working on that):
failure_demo.py:221: AssertionError
____________________ TestCustomAssertMsg.test_multiline ____________________
self = <failure_demo.TestCustomAssertMsg object at 0x2b4436e6ad30>
self = <failure_demo.TestCustomAssertMsg object at 0x2b186ee8d630>
def test_multiline(self):
class A:
@ -576,7 +577,7 @@ get on the terminal - we are working on that):
failure_demo.py:227: AssertionError
___________________ TestCustomAssertMsg.test_custom_repr ___________________
self = <failure_demo.TestCustomAssertMsg object at 0x2b4436ee92b0>
self = <failure_demo.TestCustomAssertMsg object at 0x2b186e270e48>
def test_custom_repr(self):
class JSON:
@ -594,4 +595,4 @@ get on the terminal - we are working on that):
E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a
failure_demo.py:237: AssertionError
======================== 42 failed in 0.23 seconds =========================
======================== 42 failed in 0.22 seconds =========================

View File

@ -108,7 +108,8 @@ directory with the above conftest.py::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 0 items
============================= in 0.00 seconds =============================
@ -152,12 +153,13 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 2 items
test_module.py .s
========================= short test summary info ==========================
SKIP [1] /tmp/doc-exec-73/conftest.py:9: need --runslow option to run
SKIP [1] /tmp/doc-exec-172/conftest.py:9: need --runslow option to run
=================== 1 passed, 1 skipped in 0.01 seconds ====================
@ -165,7 +167,8 @@ Or run it including the ``slow`` marked test::
$ py.test --runslow
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 2 items
test_module.py ..
@ -256,7 +259,8 @@ which will add the string to the test header accordingly::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
project deps: mylib-1.1
collected 0 items
@ -279,7 +283,8 @@ which will add info only when run with "--v"::
$ py.test -v
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-172, inifile:
info1: did you know that ...
did you?
collecting ... collected 0 items
@ -290,7 +295,8 @@ and nothing when run plainly::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 0 items
============================= in 0.00 seconds =============================
@ -322,7 +328,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 3 items
test_some_are_slow.py ...
@ -383,7 +390,8 @@ If we run this::
$ py.test -rx
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 4 items
test_step.py .Fx.
@ -391,7 +399,7 @@ If we run this::
================================= FAILURES =================================
____________________ TestUserHandling.test_modification ____________________
self = <test_step.TestUserHandling object at 0x2aad15c6d048>
self = <test_step.TestUserHandling object at 0x2b9ab60ccfd0>
def test_modification(self):
> assert 0
@ -453,7 +461,8 @@ We can run this::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 7 items
test_step.py .Fx.
@ -463,17 +472,17 @@ We can run this::
================================== ERRORS ==================================
_______________________ ERROR at setup of test_root ________________________
file /tmp/doc-exec-73/b/test_error.py, line 1
file /tmp/doc-exec-172/b/test_error.py, line 1
def test_root(db): # no db here, will error out
fixture 'db' not found
available fixtures: monkeypatch, pytestconfig, tmpdir, capfd, capsys, recwarn
available fixtures: pytestconfig, tmpdir, monkeypatch, capfd, recwarn, capsys
use 'py.test --fixtures [testpath]' for help on them.
/tmp/doc-exec-73/b/test_error.py:1
/tmp/doc-exec-172/b/test_error.py:1
================================= FAILURES =================================
____________________ TestUserHandling.test_modification ____________________
self = <test_step.TestUserHandling object at 0x2b058dc29e10>
self = <test_step.TestUserHandling object at 0x2aec569b87b8>
def test_modification(self):
> assert 0
@ -482,21 +491,21 @@ We can run this::
test_step.py:9: AssertionError
_________________________________ test_a1 __________________________________
db = <conftest.DB object at 0x2b058db494a8>
db = <conftest.DB object at 0x2aec569d1588>
def test_a1(db):
> assert 0, db # to show value
E AssertionError: <conftest.DB object at 0x2b058db494a8>
E AssertionError: <conftest.DB object at 0x2aec569d1588>
E assert 0
a/test_db.py:2: AssertionError
_________________________________ test_a2 __________________________________
db = <conftest.DB object at 0x2b058db494a8>
db = <conftest.DB object at 0x2aec569d1588>
def test_a2(db):
> assert 0, db # to show value
E AssertionError: <conftest.DB object at 0x2b058db494a8>
E AssertionError: <conftest.DB object at 0x2aec569d1588>
E assert 0
a/test_db2.py:2: AssertionError
@ -555,7 +564,8 @@ and run them::
$ py.test test_module.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 2 items
test_module.py FF
@ -563,7 +573,7 @@ and run them::
================================= FAILURES =================================
________________________________ test_fail1 ________________________________
tmpdir = local('/tmp/pytest-112/test_fail10')
tmpdir = local('/tmp/pytest-219/test_fail10')
def test_fail1(tmpdir):
> assert 0
@ -577,12 +587,12 @@ and run them::
E assert 0
test_module.py:4: AssertionError
========================= 2 failed in 0.02 seconds =========================
========================= 2 failed in 0.01 seconds =========================
you will have a "failures" file which contains the failing test ids::
$ cat failures
test_module.py::test_fail1 (/tmp/pytest-112/test_fail10)
test_module.py::test_fail1 (/tmp/pytest-219/test_fail10)
test_module.py::test_fail2
Making test result information available in fixtures
@ -645,7 +655,8 @@ and run it::
$ py.test -s test_module.py
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-172, inifile:
collected 3 items
test_module.py Esetting up a test failed! test_module.py::test_setup_fails

View File

@ -75,24 +75,25 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-109, inifile:
collected 1 items
test_smtpsimple.py F
================================= FAILURES =================================
________________________________ test_ehlo _________________________________
smtp = <smtplib.SMTP object at 0x2b88f2d1b0b8>
smtp = <smtplib.SMTP object at 0x2b058f0f53c8>
def test_ehlo(smtp):
response, msg = smtp.ehlo()
assert response == 250
> assert "merlinux" in msg
E TypeError: Type str doesn't support the buffer API
test_smtpsimple.py:11: TypeError
========================= 1 failed in 0.28 seconds =========================
> assert 0 # for demo purposes
E assert 0
test_smtpsimple.py:11: AssertionError
========================= 1 failed in 0.17 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
@ -192,35 +193,36 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-109, inifile:
collected 2 items
test_module.py FF
================================= FAILURES =================================
________________________________ test_ehlo _________________________________
smtp = <smtplib.SMTP object at 0x2b29b71bd8d0>
smtp = <smtplib.SMTP object at 0x2aec79533a58>
def test_ehlo(smtp):
response = smtp.ehlo()
assert response[0] == 250
> assert "merlinux" in response[1]
E TypeError: Type str doesn't support the buffer API
test_module.py:5: TypeError
________________________________ test_noop _________________________________
smtp = <smtplib.SMTP object at 0x2b29b71bd8d0>
smtp = <smtplib.SMTP object at 0x2aec79533a58>
def test_noop(smtp):
response = smtp.noop()
assert response[0] == 250
> assert 0 # for demo purposes
E assert 0
test_module.py:11: AssertionError
========================= 2 failed in 0.28 seconds =========================
========================= 2 failed in 0.20 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
@ -267,8 +269,8 @@ Let's execute it::
$ py.test -s -q --tb=no
FFteardown smtp
2 failed in 0.21 seconds
2 failed in 0.25 seconds
We see that the ``smtp`` instance is finalized after the two
tests finished execution. Note that if we decorated our fixture
@ -309,7 +311,7 @@ again, nothing much has changed::
$ py.test -s -q --tb=no
FF
2 failed in 0.19 seconds
2 failed in 0.17 seconds
Let's quickly create another test module that actually sets the
server URL in its module namespace::
@ -376,52 +378,52 @@ So let's just do another run::
FFFF
================================= FAILURES =================================
__________________________ test_ehlo[merlinux.eu] __________________________
smtp = <smtplib.SMTP object at 0x2b6b796568d0>
smtp = <smtplib.SMTP object at 0x2b4ce634f828>
def test_ehlo(smtp):
response = smtp.ehlo()
assert response[0] == 250
> assert "merlinux" in response[1]
E TypeError: Type str doesn't support the buffer API
test_module.py:5: TypeError
__________________________ test_noop[merlinux.eu] __________________________
smtp = <smtplib.SMTP object at 0x2b6b796568d0>
smtp = <smtplib.SMTP object at 0x2b4ce634f828>
def test_noop(smtp):
response = smtp.noop()
assert response[0] == 250
> assert 0 # for demo purposes
E assert 0
test_module.py:11: AssertionError
________________________ test_ehlo[mail.python.org] ________________________
smtp = <smtplib.SMTP object at 0x2b6b79656780>
smtp = <smtplib.SMTP object at 0x2b4ce634f7f0>
def test_ehlo(smtp):
response = smtp.ehlo()
assert response[0] == 250
> assert "merlinux" in response[1]
E TypeError: Type str doesn't support the buffer API
test_module.py:5: TypeError
-------------------------- Captured stdout setup ---------------------------
finalizing <smtplib.SMTP object at 0x2b6b796568d0>
finalizing <smtplib.SMTP object at 0x2b4ce634f828>
________________________ test_noop[mail.python.org] ________________________
smtp = <smtplib.SMTP object at 0x2b6b79656780>
smtp = <smtplib.SMTP object at 0x2b4ce634f7f0>
def test_noop(smtp):
response = smtp.noop()
assert response[0] == 250
> assert 0 # for demo purposes
E assert 0
test_module.py:11: AssertionError
4 failed in 7.02 seconds
4 failed in 6.70 seconds
We see that our two test functions each ran twice, against the different
``smtp`` instances. Note also, that with the ``mail.python.org``
@ -471,18 +473,20 @@ return ``None`` then pytest's auto-generated ID will be used.
Running the above tests results in the following test IDs being used::
$ py.test --collect-only
========================== test session starts ==========================
platform linux2 -- Python 2.7.6 -- py-1.4.25.dev2 -- pytest-2.6.0.dev1
plugins: xdist
collected 4 items
<Module 'test_ids.py'>
<Function 'test_a[spam]'>
<Function 'test_a[ham]'>
<Function 'test_b[eggs]'>
<Function 'test_b[1]'>
=========================== in 0.05 seconds ============================
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-109, inifile:
collected 6 items
<Module 'test_anothersmtp.py'>
<Function 'test_showhelo[merlinux.eu]'>
<Function 'test_showhelo[mail.python.org]'>
<Module 'test_module.py'>
<Function 'test_ehlo[merlinux.eu]'>
<Function 'test_noop[merlinux.eu]'>
<Function 'test_ehlo[mail.python.org]'>
<Function 'test_noop[mail.python.org]'>
============================= in 0.01 seconds =============================
.. _`interdependent fixtures`:
@ -516,13 +520,14 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-109, inifile:
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.63 seconds =========================
========================= 2 passed in 6.53 seconds =========================
Due to the parametrization of ``smtp`` the test will run twice with two
different ``App`` instances and respective smtp servers. There is no
@ -580,9 +585,10 @@ 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.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
rootdir: /tmp/doc-exec-109, inifile:
collecting ... collected 8 items
test_module.py::test_0[1] test0 1
PASSED
test_module.py::test_0[2] test0 2
@ -601,7 +607,7 @@ Let's run the tests in verbose mode and with looking at the print-output::
PASSED
test_module.py::test_2[2-mod2] test2 2 mod2
PASSED
========================= 8 passed in 0.01 seconds =========================
You can see that the parametrized module-scoped ``modarg`` resource caused

View File

@ -1,7 +1,7 @@
Installation and Getting Started
===================================
**Pythons**: Python 2.6-3.4, Jython, PyPy-2.3
**Pythons**: Python 2.6,2.7,3.3,3.4, Jython, PyPy-2.3
**Platforms**: Unix/Posix and Windows
@ -27,7 +27,7 @@ Installation options::
To check your installation has installed the correct version::
$ py.test --version
This is pytest version 2.6.4, imported from /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/pytest.py
This is pytest version 2.7.0, 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,8 @@ That's it. You can execute the test function now::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-112, inifile:
collected 1 items
test_sample.py F
@ -127,7 +128,7 @@ run the module by passing its filename::
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________
self = <test_class.TestClass object at 0x2b9209071470>
self = <test_class.TestClass object at 0x2ad6b3a6f278>
def test_two(self):
x = "hello"
@ -163,7 +164,7 @@ before performing the test function call. Let's just run it::
================================= FAILURES =================================
_____________________________ test_needsfiles ______________________________
tmpdir = local('/tmp/pytest-108/test_needsfiles0')
tmpdir = local('/tmp/pytest-215/test_needsfiles0')
def test_needsfiles(tmpdir):
print (tmpdir)
@ -172,8 +173,8 @@ before performing the test function call. Let's just run it::
test_tmpdir.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
/tmp/pytest-108/test_needsfiles0
1 failed in 0.02 seconds
/tmp/pytest-215/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,8 @@ them in turn::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-120, inifile:
collected 3 items
test_expectation.py ..F
@ -100,7 +101,8 @@ Let's run this::
$ py.test
=========================== test session starts ============================
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-120, inifile:
collected 3 items
test_expectation.py ..x
@ -170,8 +172,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 0x2ae3eb376c00>()
E + where <built-in method isalpha of str object at 0x2ae3eb376c00> = '!'.isalpha
E assert <built-in method isalpha of str object at 0x2ae1375d9810>()
E + where <built-in method isalpha of str object at 0x2ae1375d9810> = '!'.isalpha
test_strings.py:3: AssertionError
1 failed in 0.01 seconds
@ -185,8 +187,8 @@ 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-23/test_strings.py:1
1 skipped in 0.01 seconds
SKIP [1] /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1185: got empty parameter set, function test_valid_string at /tmp/doc-exec-120/test_strings.py:1
1 skipped in 0.00 seconds
For further examples, you might want to look at :ref:`more
parametrization examples <paramexamples>`.

View File

@ -164,7 +164,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /home/hpk/p/pytest/doc/en, inifile: pytest.ini
collected 7 items
xfail_demo.py xxxxxxx
@ -182,7 +183,7 @@ Running it with the report-on-xfail option gives this output::
reason: reason
XFAIL xfail_demo.py::test_hello7
======================== 7 xfailed in 0.04 seconds =========================
======================== 7 xfailed in 0.05 seconds =========================
.. _`skip/xfail with parametrize`:

View File

@ -29,7 +29,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-129, inifile:
collected 1 items
test_tmpdir.py F
@ -37,7 +38,7 @@ Running this would result in a passed test except for the last
================================= FAILURES =================================
_____________________________ test_create_file _____________________________
tmpdir = local('/tmp/pytest-109/test_create_file0')
tmpdir = local('/tmp/pytest-216/test_create_file0')
def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt")
@ -48,7 +49,7 @@ Running this would result in a passed test except for the last
E assert 0
test_tmpdir.py:7: AssertionError
========================= 1 failed in 0.02 seconds =========================
========================= 1 failed in 0.01 seconds =========================
.. _`base temporary directory`:

View File

@ -88,7 +88,8 @@ 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.26 -- pytest-2.6.4
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/doc-exec-130, inifile:
collected 2 items
test_unittest_db.py FF
@ -101,7 +102,7 @@ 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 0x2b98cc5a2e80>
E AssertionError: <conftest.db_class.<locals>.DummyDB object at 0x2ab102a4bac8>
E assert 0
test_unittest_db.py:9: AssertionError
@ -111,7 +112,7 @@ 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 0x2b98cc5a2e80>
E AssertionError: <conftest.db_class.<locals>.DummyDB object at 0x2ab102a4bac8>
E assert 0
test_unittest_db.py:12: AssertionError
@ -162,7 +163,7 @@ Running this test module ...::
$ py.test -q test_unittest_cleandir.py
.
1 passed in 0.05 seconds
1 passed in 0.04 seconds
... gives us one passed test because the ``initdir`` fixture function
was executed ahead of the ``test_method``.

View File

@ -51,7 +51,7 @@ Let's run it with output capturing disabled::
test called
.teardown after yield
1 passed in 0.01 seconds
1 passed in 0.00 seconds
We can also seamlessly use the new syntax with ``with`` statements.
Let's simplify the above ``passwd`` fixture::

View File

@ -28,7 +28,7 @@ def main():
name='pytest',
description='pytest: simple powerful testing with Python',
long_description=long_description,
version='2.7.0.dev1',
version='2.7.0',
url='http://pytest.org',
license='MIT license',
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],

View File

@ -2450,8 +2450,8 @@ class TestShowFixtures:
"""
''')
result = testdir.runpytest("--fixtures", p)
mark = dedent("""
------------- fixtures defined from test_show_fixtures_trimmed_doc -------------
result.stdout.fnmatch_lines("""
* fixtures defined from test_show_fixtures_trimmed_doc *
arg2
line1
line2
@ -2459,8 +2459,7 @@ class TestShowFixtures:
line1
line2
""")
assert mark in result.stdout.str()
""")
class TestContextManagerFixtureFuncs:

View File

@ -1,6 +1,6 @@
[tox]
distshare={homedir}/.tox/distshare
envlist=flakes,py26,py27,py34,pypy,py27-pexpect,py33-pexpect,py27-nobyte,py32,py33,py27-xdist,py33-xdist,py27-trial,py33-trial,doctesting,py27-cxfreeze
envlist=flakes,py26,py27,py34,pypy,py27-pexpect,py33-pexpect,py27-nobyte,py33,py27-xdist,py33-xdist,py27-trial,py33-trial,doctesting,py27-cxfreeze
[testenv]
changedir=testing