From 438d85b5adf4b5a38967fec3e1d886f6480fe7d7 Mon Sep 17 00:00:00 2001 From: holger krekel Date: Fri, 22 Nov 2013 13:44:56 +0100 Subject: [PATCH] clarify that python_functions does not apply to unittest.TestCase classes and their methods. Addresses issue284. --- _pytest/assertion/__init__.py | 6 ++++-- _pytest/assertion/util.py | 17 ++++++++++------- doc/en/customize.txt | 4 +++- doc/en/example/pythoncollection.txt | 6 ++++++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/_pytest/assertion/__init__.py b/_pytest/assertion/__init__.py index 5c64c908f..c4758bbfd 100644 --- a/_pytest/assertion/__init__.py +++ b/_pytest/assertion/__init__.py @@ -78,10 +78,12 @@ def pytest_runtest_setup(item): for new_expl in hook_result: if new_expl: - # Don't include pageloads of data unless we are very verbose (-vv) + # Don't include pageloads of data unless we + # are very verbose (-vv) if len(''.join(new_expl[1:])) > 80*8 and item.config.option.verbose < 2: new_expl[1:] = ['Detailed information truncated, use "-vv" to see'] - res = '\n~'.join(new_expl) + res = '\n'.join(new_expl) + print res if item.config.getvalue("assertmode") == "rewrite": # The result will be fed back a python % formatting # operation, which will fail if there are extraneous diff --git a/_pytest/assertion/util.py b/_pytest/assertion/util.py index ad8ed070f..3abd746ec 100644 --- a/_pytest/assertion/util.py +++ b/_pytest/assertion/util.py @@ -95,9 +95,6 @@ except NameError: def assertrepr_compare(config, op, left, right): """Return specialised explanations for some operators/operands""" width = 80 - 15 - len(op) - 2 # 15 chars indentation, 1 space around op - left_repr = py.io.saferepr(left, maxsize=int(width/2)) - right_repr = py.io.saferepr(right, maxsize=width-len(left_repr)) - summary = '%s %s %s' % (left_repr, op, right_repr) issequence = lambda x: (isinstance(x, (list, tuple, Sequence)) and not isinstance(x, basestring)) @@ -120,9 +117,7 @@ def assertrepr_compare(config, op, left, right): elif op == 'not in': if istext(left) and istext(right): explanation = _notin_text(left, right, verbose) - except py.builtin._sysex: - raise - except: + except Exception: excinfo = py.code.ExceptionInfo() explanation = [ '(pytest_assertion plugin: representation of details failed. ' @@ -130,7 +125,15 @@ def assertrepr_compare(config, op, left, right): if not explanation: return None - + if istext(left): + left_repr = left[:int(width/2)] + else: + left_repr = py.io.saferepr(left, maxsize=int(width/2)) + if istext(right): + right_repr = right[:int(width/2)] + else: + right_repr = py.io.saferepr(right, maxsize=width-len(left_repr)) + summary = '%s %s %s' % (left_repr, op, right_repr) return [summary] + explanation diff --git a/doc/en/customize.txt b/doc/en/customize.txt index d436a0672..99fd8ffc8 100644 --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -121,6 +121,8 @@ Builtin configuration file options .. confval:: python_functions One or more name prefixes determining which test functions - and methods are considered as test modules. + and methods are considered as test modules. Note that this + has no effect on methods that live on a ``unittest.TestCase`` + derived class. See :ref:`change naming conventions` for examples. diff --git a/doc/en/example/pythoncollection.txt b/doc/en/example/pythoncollection.txt index abf6340c0..311140c91 100644 --- a/doc/en/example/pythoncollection.txt +++ b/doc/en/example/pythoncollection.txt @@ -53,6 +53,12 @@ then the test collection looks like this:: ============================= in 0.01 seconds ============================= +.. note:: + + the ``python_functions`` and ``python_classes`` has no effect + for ``unittest.TestCase`` test discovery because pytest delegates + detection of test case methods to unittest code. + Interpreting cmdline arguments as Python packages -----------------------------------------------------