Re: Avoid deprecation warnings in the testrunner

Marius Gedminas <[email protected]>
Newsgroups gmane.comp.web.zope.devel
Message-ID <20091223133336.GA3859@platonas>
On Wed, Dec 23, 2009 at 01:36:33PM +0100, Fabio Tranchitella wrote:
> I think we should provide a zope.testing package which does not emit
> deprecation warnings while running the testrunner on other packages,
> otherwise there is no way to really understand why the package you are
> working on is using a deprecated API.

+1

> I propose the patch attached to this message to zope.testing.
> 
> It tries to avoid importing zope.testing.doctest unless it is really
> needed. In this way, developers can see the DeprecationWarning with the
> path of *their* code, and fix it, instead of receiving the
> DeprecationWarning because the testrunner imports zope.testing.doctest
> itself.
> 
> Before applying the patch, running the tests on another package produced
> this output:
> 
> -----------------------------------------------------------------------
> .../zope/testing/testrunner/debug.py:23: DeprecationWarning: zope.testing.doctest is deprecated in favour of the Python standard library doctest module
>   from zope.testing import doctest
> Running zope.testing.testrunner.layer.UnitTests tests:
>   ...
> -----------------------------------------------------------------------
> 
> After applying my patch, I get this:
> 
> -----------------------------------------------------------------------
> .../zope/interface/tests/test_adapter.py:405: DeprecationWarning: zope.testing.doctest is deprecated in favour of the Python standard library doctest module
>   from zope.testing import doctest
> Running zope.testing.testrunner.layer.UnitTests tests:
>   ...
> -----------------------------------------------------------------------
> 
> Comments?

Let's look at it:

> Thanks,
> Fabio

> Index: src/zope/testing/testrunner/formatter.py
> ===================================================================
> --- src/zope/testing/testrunner/formatter.py	(revisione 106999)
> +++ src/zope/testing/testrunner/formatter.py	(copia locale)
> @@ -19,10 +19,9 @@
>  import sys
>  import re
>  import traceback
> +import warnings
>  
> -from zope.testing import doctest
>  
> -
>  doctest_template = """
>  File "%s", line %s, in %s
>  
> @@ -328,6 +327,9 @@
>      def format_traceback(self, exc_info):
>          """Format the traceback."""
>          v = exc_info[1]
> +        warnings.simplefilter('ignore')
> +        from zope.testing import doctest
> +        warnings.filters.pop()

I'm not thrilled.

Can we 'import doctest' from the stdlib, and hope that these isinstance
checks work fine?

Specifically, can we make it so that zope.testing.doctest's exceptions
_inherit_ from stdlib's doctest exceptions?

Otherwise people who convert to stdlib's doctest to avoid deprecation
warnings will lose all the nice doctest formatting and post-mortem
debugging bits they're accustomed to.

>          if isinstance(v, doctest.DocTestFailureException):
>              tb = v.args[0]
>          elif isinstance(v, doctest.DocTestFailure):
> @@ -560,6 +562,9 @@
>          print
>          print self.colorize('error', msg)
>          v = exc_info[1]
> +        warnings.simplefilter('ignore');
> +        from zope.testing import doctest
> +        warnings.filters.pop()
>          if isinstance(v, doctest.DocTestFailureException):
>              self.print_doctest_failure(v.args[0])
>          elif isinstance(v, doctest.DocTestFailure):
> Index: src/zope/testing/testrunner/doctest.py
> ===================================================================
> --- src/zope/testing/testrunner/doctest.py	(revisione 106999)
> +++ src/zope/testing/testrunner/doctest.py	(copia locale)
> @@ -17,10 +17,11 @@
>  """
>  
>  import sys
> -from zope.testing import doctest
>  import zope.testing.testrunner.feature
>  
> +from zope.testing import doctest
>  
> +

Doesn't seem like much of a change ;)

Suggest importing stdlib here as well.

>  class DocTest(zope.testing.testrunner.feature.Feature):
>  
>      active = True
> Index: src/zope/testing/testrunner/runner.py
> ===================================================================
> --- src/zope/testing/testrunner/runner.py	(revisione 106999)
> +++ src/zope/testing/testrunner/runner.py	(copia locale)
> @@ -34,7 +34,6 @@
>  from zope.testing.testrunner.refcount import TrackRefs
>  from zope.testing.testrunner.options import get_options
>  import zope.testing.testrunner.coverage
> -import zope.testing.testrunner.doctest
>  import zope.testing.testrunner.logsupport
>  import zope.testing.testrunner.selftest
>  import zope.testing.testrunner.profiling
> @@ -177,7 +176,10 @@
>          self.features.append(zope.testing.testrunner.selftest.SelfTest(self))
>          self.features.append(zope.testing.testrunner.logsupport.Logging(self))
>          self.features.append(zope.testing.testrunner.coverage.Coverage(self))
> -        self.features.append(zope.testing.testrunner.doctest.DocTest(self))
> +        if options.ndiff or options.udiff or options.cdiff or \
> +           options.report_only_first_failure is not None:
> +            from zope.testing.testrunner.doctest import DocTest
> +            self.features.append(DocTest(self))

A *strong* -1 for this bit.

>          self.features.append(zope.testing.testrunner.profiling.Profiling(self))
>          if is_jython:
>              # Jython GC support is not yet implemented
> Index: src/zope/testing/testrunner/debug.py
> ===================================================================
> --- src/zope/testing/testrunner/debug.py	(revisione 106999)
> +++ src/zope/testing/testrunner/debug.py	(copia locale)
> @@ -20,12 +20,12 @@
>  import sys
>  import pdb
>  
> -from zope.testing import doctest
>  import zope.testing.testrunner.interfaces
>  
>  
>  def post_mortem(exc_info):
>      err = exc_info[1]
> +    from zope.testing import doctest

Same here: I'd like to use stdlib's doctest.

>      if isinstance(err, (doctest.UnexpectedException, doctest.DocTestFailure)):
>  
>          if isinstance(err, doctest.UnexpectedException):

Cheers!
Marius Gedminas
-- 
http://pov.lt/ -- Zope 3 consulting and development

_______________________________________________
Zope-Dev maillist  -  [email protected]
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 https://mail.zope.org/mailman/listinfo/zope-announce
 https://mail.zope.org/mailman/listinfo/zope )
signature.asc (application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iD8DBQFLMhwskVdEXeem148RAumYAJ9ON6pdonVQ5yTL53U5x11Rz6nMXgCght+0
k8q3UST7i7rDpH2A1+53Ywk=
=T7Va
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.