Re: zope.testbrowser and WebTest (round 2)

Brian Sutherland <[email protected]>
Newsgroups gmane.comp.web.zope.devel
Message-ID <[email protected]>
On Mon, Jan 31, 2011 at 07:02:35AM +0100, Wolfgang Schnerring wrote:
> * Brian Sutherland <[email protected]> [2011-01-30 16:04]:
> > I've finally finished refactoring my WebTest/testbrowser branches,
> > basically doing this:
> >
> >     - Integrate with WebTest. zope.testbrowser.webtest.Browser is a new
> >       Browser implementation that uses webtest.TestApp to drive a WSGI 
> >       application. This allows simple and direct testing of WSGI applications.
> >
> >     - Re-write the test application as a pure WSGI application using WebOb.
> >       Run the existing tests using the WebTest based Browser
> >
> >     - Move zope.app.testing based Browser into zope.app.testing (leaving
> >       backwards compatibility imports in-place).
> >
> > This is a very big change, so I would appreciate anyone who would take a
> > look at these branches before I merge:
> 
> Michael Howitz and I recently polished the integration of
> zope.testbrowser and wsgi_intercept to accomplish pretty much the same
> things you mentioned. (I'm aware that you two exchanged some emails
> about it, but don't know any details).
> 
> So I'm curious: What are the differences bewteen WebTest and
> wsgi_intercept? Is one preferable to the other?

The differences I've seen between the two libraries:

    * WebTest doesn't require a global setup/teardown. (no zope.testing
      Layer dependency)
    * With WebTest it's more difficult to accidentally end up sending
      real HTTP requests over the internet.

I'm probably missing quite a few though.

Another interesting datapoint is the number of downloads of each package
from pypi.python.org:

    * http://pypi.python.org/pypi/wsgi_intercept/0.4
        13000 downloads in 2 years
    * http://pypi.python.org/pypi/WebTest/1.2.3
        18500 downloads in 2 months

> I'd very much like there to be *one* way of doing WSGI with the
> testbrowser, and at first blush I don't care whether that's WebTest or
> wsgi_intercept or whathaveyou, as long as it fulfills its purpose. 

We have already committed to wsgi_intercept integration for the long
term. It was released in zope.testbrowser 3.11 a few days ago, right? If
we are to have only one way to do this, then wsgi_intercept must be it.

But I'm ambivalent about only having one way to do things. I think
having both integrations in zope.testbrowser is not such a bad thing.
Having the test suite run over 2 different integrations is definitely
good.

> I'll gladly review your branch, but I'd like to know the motivation
> behind it.

Only ~30% of the branch is the implementation of the WebTest connection.

The other ~70% of the branch is a refactoring of the test suite. That's
where the reduction in test dependencies comes from. The test fixture on
the branch is a reasonably minimal WSGI application run via the WebTest
connection.

Attached is a patch for my branch to run the test suite with the
wsgi_intercept integration. I havn't committed it yet as it has multiple
failures.

A way forward may be to fix the wsgi_intercept integration so that it
can run the full test suite then merge my branch without the WebTest
integration. However I would prefer to merge the WebTest integration as
is and fix the wsgi_intercept integration.

> 
> Wolfgang
> 
> _______________________________________________
> 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 )

-- 
Brian Sutherland

_______________________________________________
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 )
run_tests_via_wsgi_intercept.patch (text/plain, 1.8 KB)
Index: tests/test_doctests.py
===================================================================
--- tests/test_doctests.py	(revision 120009)
+++ tests/test_doctests.py	(working copy)
@@ -17,26 +17,45 @@
 
 import zope.testbrowser.ftests.wsgitestapp
 import zope.testbrowser.webtest
+import zope.testbrowser.wsgi
 
-def make_browser(*args, **kw):
+def make_webtest_browser(*args, **kw):
     app = zope.testbrowser.ftests.wsgitestapp.WSGITestApplication()
     return zope.testbrowser.webtest.Browser(app, *args, **kw)
 
+
+class WsgiInterceptLayer(zope.testbrowser.wsgi.Layer):
+
+    def make_wsgi_app(self):
+        return zope.testbrowser.ftests.wsgitestapp.WSGITestApplication()
+
+
 def test_suite():
     flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
 
-    suite = doctest.DocFileSuite(
+    webtest_suite = doctest.DocFileSuite(
         'README.txt',
         'cookies.txt',
         'wsgi.txt',
         'fixed-bugs.txt',
         optionflags=flags,
-        globs=dict(Browser=make_browser),
+        globs=dict(Browser=make_webtest_browser),
         checker=zope.testbrowser.tests.helper.checker,
         package='zope.testbrowser')
 
+    wsgi_suite = doctest.DocFileSuite(
+        'README.txt',
+        'cookies.txt',
+        'wsgi.txt',
+        'fixed-bugs.txt',
+        optionflags=flags,
+        globs=dict(Browser=zope.testbrowser.wsgi.Browser),
+        checker=zope.testbrowser.tests.helper.checker,
+        package='zope.testbrowser')
+    wsgi_suite.layer = WsgiInterceptLayer()
+
     wire = doctest.DocFileSuite('over_the_wire.txt', optionflags=flags,
                                 package='zope.testbrowser')
     wire.level = 2
 
-    return unittest.TestSuite((suite, wire))
+    return unittest.TestSuite((wsgi_suite, webtest_suite, wire))
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.