[Zope-dev] zope.testbrowser and WebTest (round 2)
Brian Sutherland
brian at vanguardistas.net
Mon Jan 31 03:54:52 EST 2011
On Mon, Jan 31, 2011 at 07:02:35AM +0100, Wolfgang Schnerring wrote:
> * Brian Sutherland <brian at vanguardistas.net> [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 - Zope-Dev at zope.org
> 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
-------------- next part --------------
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))
More information about the Zope-Dev
mailing list