[py-svn] commit/pytest: hpk42: refine and streamline Floris example for an assert_reprcompare hook.
Bitbucket
commits-noreply at bitbucket.org
Mon Jun 20 18:13:01 CEST 2011
1 new changeset in pytest:
http://bitbucket.org/hpk42/pytest/changeset/df6b782c6c26/
changeset: df6b782c6c26
user: hpk42
date: 2011-06-20 18:12:48
summary: refine and streamline Floris example for an assert_reprcompare hook.
affected #: 1 file (2.4 KB)
--- a/doc/assert.txt Mon Jun 20 14:18:12 2011 +0200
+++ b/doc/assert.txt Mon Jun 20 18:12:48 2011 +0200
@@ -22,14 +22,14 @@
you will see the return value of the function call::
$ py.test test_assert1.py
- =========================== test session starts ============================
- platform linux2 -- Python 2.6.6 -- pytest-2.0.3
+ ============================= test session starts ==============================
+ platform darwin -- Python 2.7.0 -- pytest-2.1.0.dev4
collecting ... collected 1 items
test_assert1.py F
- ================================= FAILURES =================================
- ______________________________ test_function _______________________________
+ =================================== FAILURES ===================================
+ ________________________________ test_function _________________________________
def test_function():
> assert f() == 4
@@ -37,7 +37,7 @@
E + where 3 = f()
test_assert1.py:5: AssertionError
- ========================= 1 failed in 0.02 seconds =========================
+ =========================== 1 failed in 0.05 seconds ===========================
py.test has support for showing the values of the most common subexpressions
including calls, attributes, comparisons, and binary and unary
@@ -104,14 +104,14 @@
if you run this module::
$ py.test test_assert2.py
- =========================== test session starts ============================
- platform linux2 -- Python 2.6.6 -- pytest-2.0.3
+ ============================= test session starts ==============================
+ platform darwin -- Python 2.7.0 -- pytest-2.1.0.dev4
collecting ... collected 1 items
test_assert2.py F
- ================================= FAILURES =================================
- ___________________________ test_set_comparison ____________________________
+ =================================== FAILURES ===================================
+ _____________________________ test_set_comparison ______________________________
def test_set_comparison():
set1 = set("1308")
@@ -124,7 +124,7 @@
E '5'
test_assert2.py:5: AssertionError
- ========================= 1 failed in 0.03 seconds =========================
+ =========================== 1 failed in 0.05 seconds ===========================
Special comparisons are done for a number of cases:
@@ -134,6 +134,54 @@
See the :ref:`reporting demo <tbreportdemo>` for many more examples.
+Defining your own assertion comparison
+----------------------------------------------
+
+It is possible to add your own detailed explanations by implementing
+the ``pytest_assertrepr_compare`` hook.
+
+.. autofunction:: _pytest.hookspec.pytest_assertrepr_compare
+
+As an example consider adding the following hook in a conftest.py which
+provides an alternative explanation for ``Foo`` objects::
+
+ # content of conftest.py
+ from test_foocompare import Foo
+ def pytest_assertrepr_compare(op, left, right):
+ if isinstance(left, Foo) and isinstance(right, Foo) and op == "==":
+ return ['Comparing Foo instances:',
+ ' vals: %s != %s' % (left.val, right.val)]
+
+now, given this test module::
+
+ # content of test_foocompare.py
+ class Foo:
+ def __init__(self, val):
+ self.val = val
+
+ def test_compare():
+ f1 = Foo(1)
+ f2 = Foo(2)
+ assert f1 == f2
+
+you can run the test module and get the custom output defined in
+the conftest file::
+
+ $ py.test -q test_foocompare.py
+ collecting ... collected 1 items
+ 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.05 seconds
.. _assert-details:
.. _`assert introspection`:
@@ -198,111 +246,3 @@
``--nomagic``.
-Defining your own comparison
-----------------------------------------------
-
-
-As already shown in examples py.test is able to provide detailed
-explanations when an assertial fails. E.g. when comparing a
-dictionary it will show you which elements differ::
-
- $ py.test example.py
- ============================= test session starts ==========================
- platform linux2 -- Python 2.7.1 -- pytest-2.0.3
- collected 1 items
-
- example.py F
-
- =================================== FAILURES ===============================
- __________________________________ test_text _______________________________
-
- def test_text():
- > assert {'foo': 0, 'bar': 1} == {'foo': 0, 'bar': 0}
- E assert {'bar': 1, 'foo': 0} == {'bar': 0, 'foo': 0}
- E - {'bar': 1, 'foo': 0}
- E ? ^
- E + {'bar': 0, 'foo': 0}
- E ? ^
-
- example.py:2: AssertionError
- =========================== 1 failed in 0.03 seconds =======================
-
-
-py.test has builtin knowledge about displaying detailed information
-for a number of types. If the objects compared do not match those it
-will fall back to a less detailed genric comparison, e.g.::
-
- $ py.test example2.py
- ============================= test session starts ==========================
- platform linux2 -- Python 2.7.1 -- pytest-2.0.3
- collected 1 items
-
- example2.py F
-
- =================================== FAILURES ===============================
- ________________________________ test_foo __________________________________
-
- def test_foo():
- f = Foo(1)
- g = Foo(2)
- > assert f == g
- E assert <example2.Foo object at 0x190de90> == <example2.Foo object at 0x190df10>
-
- example2.py:24: AssertionError
- =========================== 1 failed in 0.03 seconds =======================
-
-
-The detailed builtin comparisons are currently only present for
-strings, sequences, sets and dictionaries which are compared for
-equality (``==``) and for strings with a ``not in`` comparison.
-However it is possible to add your own detailed explanations using the
-``pytest_assertrepr_compare`` hook.
-
-.. py:function:: pytest_assertrepr_compare(config, op, left, right)
-
- The *config* argument is a ``_pytest.config.Config``
- instance. *op* will be the comparison operator: ``==``, ``<``,
- ``in``, etc. While *left* and *right* will contain the objects
- which are being compared.
-
- The return value must be either *None* in case this hook does not
- provide an explanation for the arguments passed in, or a list of
- strings. Each string in the list will be regarded as a line and
- displayed on a line by itself. The first line is slightly special
- and is meant to be a summary with the detailed explanation
- following on the other lines.
-
-
-As an example consider adding following hook in a conftest.py which
-provides an alternative explanation for the ``Foo`` type used above::
-
- def pytest_assertrepr_compare(op, left, right):
- if (not isinstance(left, example2.Foo) or
- not isinstance(right, example2.Foo) or
- op != '=='):
- return None
- return ['Comparing Foo instances:',
- ' vals: %s != %s' % (left.val, right.val)]
-
-When re-running the above example after adding this in the conftest.py
-file the output now contains a more detailed description::
-
- $ python pytest.py example2.py
- ============================= test session starts ==========================
- platform linux2 -- Python 2.7.1 -- pytest-2.1.0.dev4
- collected 1 items
-
- example2.py F
-
- =================================== FAILURES ===============================
- ___________________________________ test_foo _______________________________
-
- def test_foo():
- f = Foo(1)
- g = Foo(2)
- > assert f == g
- E assert Comparing Foo instances:
- E vals: 1 != 2
-
- example2.py:24: AssertionError
- =========================== 1 failed in 0.03 seconds =======================
Repository URL: https://bitbucket.org/hpk42/pytest/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
More information about the pytest-commit
mailing list