[Zope-dev] RFC: Proposed new style for documenting and testing ZTK packages

Marius Gedminas marius at gedmin.as
Mon Apr 19 09:48:14 EDT 2010


On Mon, Apr 19, 2010 at 12:50:23PM +0200, Adam GROSZER wrote:
> Hello Tres,
> 
> Saturday, April 17, 2010, 3:41:02 AM, you wrote:
> 
> TS> -----BEGIN PGP SIGNED MESSAGE-----
> TS> Hash: SHA1
> 
> <snip>
> 
> +lots on more docs
> +lots on 100% coverage
> 
> TS> The trickier testing bits we would re-write as super thorough, no
> TS> shortcuts-taken unit tests:  one testcase class per class (or API
> TS> function) under test, at least one method per class-under-test method,
> TS> with more preferred to get all code paths / preconditions covered.  The
> TS> goal here would be to comment out the doctests from the test_suites and
> TS> get the code to 100% coverage using pure unit tests.  Meanwhile, the
> TS> doctests would be refactored into the Sphinx documentation, losing all
> TS> the bits which obscure their intent as documentation.
> 
> I'm somewhat vary on unittests. I've seen some damn cryptic ones that
> took a lot of time to decipher.
> A doctest somehow forces you to dump your mind (well at least that, if
> we're not that brilliant techdoc writers).

That's true, but if the doctest gets too long, any readability
advantages are negated.

If you've the discipline to keep the doctests short, I don't see why you
shouldn't continue writing them instead of unit tests -- and by "short"
I mean 1-7 statements:

    import unittest
    import doctest

    from mypackage.mymodule import MyClass

    class TestMyClass(unittest.TestCase):

        def test_foo():
            x = MyClass()
            self.assertEquals(x.foo(), 42)


    def doctest_MyClass_bar():
        """Test MyClass.bar

            >>> y = MyClass()

         The bar method peforms a bar calculation that typically returns
         twenty-three:

            >>> y.bar()
            23

        """


    def doctest_MyClass_bar_raises_if_incorrect_setup():
        """Test MyClass.bar

            >>> y = MyClass(setup='incorrect')

         If you haven't supplied the correct setup, you get an
         exception:

            >>> y.bar()
            Traceback (most recent call last):
              ...
            IncorrectSetupError: the setup was incorrect

        """


    def test_suite():
        return unittest.TestSuite([
            unittest.makeSuite(TestMyClass),
            doctest.DocTestSuite(),
        ])

The downside of this style is that it's difficult to refactor common
bits from the doctests into shared methods, so you end up with a lot of
duplicated code.

> OTOH I think most unittests maybe have some comments, worst case they
> don't even use "speaking" variable names.
> I'm not sure whether we can enforce such rules (super thorough, no
> shortcuts-taken, well commented) if we can't easier ones.

Marius Gedminas
-- 
http://pov.lt/ -- Zope 3 consulting and development
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
Url : http://mail.zope.org/pipermail/zope-dev/attachments/20100419/246dd348/attachment.bin 


More information about the Zope-Dev mailing list