/usr/share/pyshared/zope/app/appsetup/testlayer.txt is in python-zope.app.appsetup 3.16.0-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | Layers
======
zope.app.appsetup.testlayer define a test layer which creates a test
database.
ZODBLayer
---------
We can instantiate a ZODBLayer::
>>> from zope.app.appsetup.testlayer import ZODBLayer
>>> from zope.app.appsetup import testpackage
>>> layer = ZODBLayer(testpackage)
>>> layer
<zope.app.appsetup.testlayer.ZODBLayer object at ...>
Now we run some tests with this layer that checks that we have a
working database::
>>> import unittest
>>> import transaction
>>> from zope import component
>>> from zope.app.appsetup.testpackage import testobject
>>> from ZODB.interfaces import IDatabase
>>> class TestCase(unittest.TestCase):
... layer = layer
...
... def testAddObjectInDB(self):
... root = self.layer.getRootFolder()
... root['object'] = testobject.TestObject()
... transaction.commit()
... self.failUnless('object' in root)
... def testNoMoreObjectInDB(self):
... root = self.layer.getRootFolder()
... self.failIf('object' in root)
... def testApplicationInDB(self):
... root = self.layer.getRootFolder()
... self.assertEquals(
... repr(root.__class__), "<class 'zope.site.folder.Folder'>")
... def testDBRegistered(self):
... root = self.layer.getRootFolder()
... db = component.getUtility(IDatabase, name='main')
... self.assertEquals(db, root._p_jar.db())
We define a suite with our test:
>>> suite = unittest.TestSuite()
>>> suite.addTest(unittest.makeSuite(TestCase))
And run that suite:
>>> from zope.testrunner.runner import Runner
>>> runner = Runner(args=[], found_suites=[suite])
>>> succeeded = runner.run()
Running zope.app.appsetup.testpackage.ZODBLayer tests:
Set up zope.app.appsetup.testpackage.ZODBLayer in ... seconds.
Ran 4 tests with 0 failures and 0 errors in ... seconds.
Tearing down left over layers:
Tear down zope.app.appsetup.testpackage.ZODBLayer in ... seconds.
Database stacking with ZODBlayer
--------------------------------
When deriving from ZODBLayer we can start populating a test database at layer
setup time. Each test will be run with a DemoStorage wrapped around that
baseline and unwrapped afterwards. This way you can save a significant amount
of time if tests require shared setup.
We start with a derived layer, based on ZODBLayer that has some setup code:
>>> class CustomZODBLayer(ZODBLayer):
... def setUp(self):
... super(CustomZODBLayer, self).setUp()
... root = self.getRootFolder()
... root['foo'] = 1
... transaction.commit()
>>> layer = CustomZODBLayer(testpackage)
>>> layer
<CustomZODBLayer object at ...>
Now, when running tests in this layer, each test sees the prepopulated
database but is still isolated from other tests' changes:
>>> class CustomZODBLayerTests(unittest.TestCase):
... layer = layer
... def test_test1(self):
... root = self.layer.getRootFolder()
... self.assertEquals(1, len(root))
... root['bar'] = 1
... transaction.commit()
... def test_test2(self):
... root = self.layer.getRootFolder()
... self.assertEquals(1, len(root))
... root['baz'] = 1
... transaction.commit()
Run the tests to prove that above statements are correct::
>>> suite = unittest.TestSuite()
>>> suite.addTest(unittest.makeSuite(CustomZODBLayerTests))
And run that suite:
>>> from zope.testrunner.runner import Runner
>>> runner = Runner(args=[], found_suites=[suite])
>>> succeeded = runner.run()
Running zope.app.appsetup.testpackage.CustomZODBLayer tests:
Set up zope.app.appsetup.testpackage.CustomZODBLayer in ... seconds.
Ran 2 tests with 0 failures and 0 errors in ... seconds.
Tearing down left over layers:
Tear down zope.app.appsetup.testpackage.CustomZODBLayer in ... seconds.
|