For those of you who say they don't like doctests because they don't give you isolation between tests. Here's an example of an integration doctest for Plone that gives you exactly that:
from Testing import ZopeTestCase as ztc
from Products.PloneTestCase import PloneTestCase as ptc
from Products.PloneTestCase.layer import PloneSite
ZOPE_DEPS = ['MyZopeProductDependecy']
PLONE_DEPS = ['MyPloneProduct',
'MyPloneDependency']
for x in ZOPE_DEPS + PLONE_DEPS:
ztc.installProduct(x)
ptc.setupPloneSite(products=PLONE_DEPS)
class MyTest:
def test_one():
r"""
Check if one and one is two:
>>> 1 + 1
2
"""
def test_two():
r"""
Check if one minus one is zero:
>>> 1 - 1
0
"""
def test_suite():
suite = ztc.ZopeDocTestSuite(test_class=ptc.PloneTestCase)
suite.layer = PloneSite
return suite
Look at G. Writing Tests in the (somewhat out of date) The Zope 3 Developer's Book for more inspiration.
Don't do traditional-style unit tests, they're ugly. Is this a matter of test, err taste? I don't think so.
Of course, if you want real isolation, you go for unit tests (i.e. no ZopeTestCase involved). People are usually scared and say, but then I need to set so much up by hand, or, don't make me write a mock object for everything, but those arguments aren't really valid most of the time. This is how easy a pure unit test using doctest for a Plone Product (or any Python program) can look like:
import unittest
from zope.testing import doctest
class Add:
r"""
>>> 1 + 1
2
"""
class Subtract:
r"""
>>> 1 - 1
0
"""
def test_suite():
return unittest.TestSuite((doctest.DocTestSuite()))
If you have a hard time creating mock objects to test against, try Mocky. This is an example of mocking a CMF site that gives you getPhysicalPath, has a portal_catalog and some special site_properties for use with your content type:
>>> from mocky import Mocky
>>> import Acquisition
>>> class MockySite(Mocky, Acquisition.Explicit):
... def getPhysicalPath(self):
... return tuple(self.name.split('.'))
... def portal_catalog(self, **kwargs):
... return []
>>> site = MockySite('site')
>>> props = site.portal_properties.site_properties
>>> props.getProperty = lambda x: 'utf-8' # doctest: +ELLIPSIS
Set site.portal_properties.site_properties.getProperty to <function ...>
>>> from Products.MyProduct.content import MyContentType
>>> content = MyContentType('someid').__of__(site)
>>> content.something_that_involves_using_portalcatalog_and_siteproperties()
'your result here'
Update: The python-in-testing list has an interesting discussion about doctest vs. unittest.
posted at: 16:06 |
0 comments |
category: /devel/zope
|
permanent link |
add to del.icio.us or digg it
| < | March 2007 | > | ||||
| Su | Mo | Tu | We | Th | Fr | Sa |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Feed of all categories:
rss |
atom