[Grok-dev] Stuck on unit/integration testing

Peter Bengtsson peter at fry-it.com
Mon Feb 25 12:51:51 EST 2008


Arrh!!

Here's bloody why it didn't work: In my test_something.py I wrote
from peterbebloglife.app import PeterbeLifeBlog

and that killed the unit test. BUT there's a HUGE difference between
peterbebloglife and peterbelifeblog!!!

I can now import my app both in the doctest and in the unittest. With 
this I can now really get started writing proper tests and get on with 
things.

I really feel like writing a how-to for dummies for grok.zope.org now. I 
think you deserve it and it's a fair punishment for me for doing this 
stupid typo mistake.


Thanks a zillion!
I'll be back.

Uli Fouquet wrote:
> Hi Peter,
> 
> please apologize the length of this mail. I am sure only a few points
> will touch your problem, but it might be important for others.
> 
> Peter Bengtsson wrote:
>> I've setup z3c.testsetup into my buildout and I can run ./bin/test.
>> In PeterbeLifeBlog/src/peterbelifeblog/tests.py I have this code::
>>
>> import z3c.testsetup
>> test_suite = z3c.testsetup.register_all_tests('peterbelifeblog.app_tests')
>>
>> And in PeterbeLifeBlog/src/peterbelifeblog/app_tests/test_something.py
>> I have the following code::
>>
>> """
>> Tests with real TestCase objects.
>>
>> :Test-Layer: python
>>
>> """
>> import unittest
>> class TestTest(unittest.TestCase):
>>
>>      def setUp(self):
>>          pass
>>
>>      def testFoo(self):
>>          self.assertEqual(2, 1+1)
>>
>>
>> So far so good. How do I get started from here to write unit tests and 
>> functional tests?
> 
> I assume, the test is executed when you start the test runner? That's
> fine. If not, please check your buildout.cfg. The 'tests-pattern' in
> defaults must match your modulename (here: 'tests', the modulename of a
> file 'tests.py').
> 
>> I want to import my application class and some other stuff from app.py 
>> and run normal unit tests and I also want to write unit tests with Grok 
>> up and running with an instance object in ZODB like I'm able to do in 
>> zope2's ZopeTestCase with the self.app thing.
>>
>> It feels like it's right there in front of my but I don't know how to 
>> get started.
> 
> I'm not sure where exactly the problem is, therefore I might give some
> hints for some different questions:
> 
> How to create testfiles
> -----------------------
> 
> For unit doctests:
> 
>   In your `app_tests` directory create a file `app_unittests.txt` and 
>   in there write something like this::
> 
>     My Unit Tests For app
>     *********************
> 
>     :Test-Layer: unit
> 
>     We start with a simple problem::
> 
>        >>> 1+1
>        2
> 
>     Hope that does not fail.
> 
> For functional doctests:
> 
>    Do the same (with a different file), but use 
>    `:Test-Layer: functional` as marker string.
> 
> Run bin/test and the tests should be executed.
> 
> 
> How to write tests in Zope3 environments generally
> --------------------------------------------------
> 
> The difference between both kinds of tests, unit doctests and functional
> doctests is somewhat complex to explain. For short: in functional
> doctests you get a whole framework environment running during tests.
> This enables you, for instance, to write browser tests, were you can
> send simulated requests to a server instance and check the results. You
> can also make nasty things with the ZODB.
> 
> Unfortunately, all this goes more into _writing_ of tests, while
> z3c.testsetup tries only to ease the _setup_ of those. I personally
> learned most about writing tests in Zope 3 from 
> 
>  - Philipps book, 
> 
>  - reading tests of other packages and, of course, 
> 
>  - the documentation of the testing packages. Namely 
> 
>      * zope.testing,
> 
>      * zope.app.testing and 
> 
>      * zope.testbrowser. 
> 
>    See all those READMEs and other .txt files in that packages. You can 
>    browse them conveniently via
> 
>      http://apidoc.zope.org/++apidoc++/
> 
>    or for a special package:
> 
>      http://apidoc.zope.org/++apidoc++/Code/<pkg_name_sep_by_slashes>
> 
>    For example:
> 
>           http://apidoc.zope.org/++apidoc++/Code/zope/app/testing
> 
>    for the `zope.app.testing` package. There you can watch the .txt 
>    files rendered nicely to HTML.
>   
>    The docgrok doc browser works similar, but lists also packages that 
>    are not in the 'zope' namespace. Unfortunately it is broken for 
>    'zope' packages in the 0.11 version (fixed in the trunk).
> 
> I understand, that some special introduction to this topic is still
> missing (beside Philipps book, which I would recommend warmly). Please
> give some time for that. After having the basic issues fixed, I will try
> to give some more general introduction to testing on the grok website.
> 
> 
> How to test my app
> ------------------
> 
> This is a more specific question than how to write tests in general, but
> might be your real problem here. I cannot explain every dirty detail of
> that here, but to grab your application in tests you can do something
> like this:
> 
> - in unit doctests:
> 
>     Here you normally create instances of your app and check things, 
>     that do not require browser-based interaction::
> 
>        >>> from peterbelifeblog.app import Cave
>        >>> cave = Cave()
> 
>      Then you can run your tests::
> 
>        >>> len(cave.things)
>        0
> 
>        >>> cave.poulate('club')
>        >>> len(cave.things)
>        1
> 
> - in functional doctests:
> 
>     Here you can also create an instance of your app by doing simulated 
>     browser requests::
> 
>       >>> from zope.testbrowser.testing import Browser
>       >>> browser = Browser()
>       >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
> 
>     We fetch the standard page, which should provide us a menu to get 
>     all installable grok applications/components.
> 
>       >>> browser.open("http://localhost/")
>       >>> print browser.contents
>       <html xmlns="http://www.w3.org/1999/xhtml">
>       ...
>       ...      <legend>Add application</legend>
>       ...
> 
>     We are able to add a mammoth manager...
> 
>       >>> subform = browser.getForm(name='MammothManager')
>       >>> subform.getControl(
>       ....    'Name your new app:').value = 'my-mammoth-manager'
>       >>> subform.getControl('Create').click()
> 
>       >>> print browser.contents
>       <html xmlns="http://www.w3.org/1999/xhtml">
>       ...
>       ...<legend>Installed applications</legend>
>       ...
>       ...<a href="http://localhost/my-mammoth-manager">
>       ...
> 
>    etc. You get the idea. 
> 
>    To get the root folder of your testing environment, you can use the 
> 
>       zope.app.testing.functional.getRootFolder()
> 
>    function. With z3c.testsetup this is already imported as a global, 
>    so that you can simply write (without prior imports)::
> 
>       >>> root = getRootFolder()
>       >>> root['my-mammoth-manager']
>       <MammothManager object at 0x...>
> 
>    or similar.
> 
> 
> 
>> Besides, in my test_something.py I tried to do this:
>> from peterbelifeblog.app import SomeClass
>> but I keep getting ImportErrors even though the folder 'peterbelifeblog' 
>> is in sys.path.
> 
> This is really strange. Is it a grokproject? Would you mind giving me a
> view on the complete project/setup (via private mail)? At least a
> complete failure log (traceback or testrunner output when run with -v
> option) would help.
> 
> Kind regards,
> 

-- 
Peter Bengtsson,
work www.fry-it.com
home www.peterbe.com
hobby www.issuetrackerproduct.com


More information about the Grok-dev mailing list