Tests schreiben
Tests erstellen
Statt der bereits angelegten Datei src/vs.policy/vs/policy/tests.py erstellen wir ein eigenes tests-Modul:
$ rm -rf src/vs.policy/vs/policy/tests.py $ mkdir src/vs.policy/vs/policy/tests $ touch src/vs.policy/vs/policy/tests/__init__.py
Anschließend definieren wir im neu erstellten tests-Ordner zunächst ein Test-Fixture, eine gleichbleibende Testumgebung mit der Basisklasse VsPolicyTestCase. Hierzu erstellen wir im tests-Verzeichnis die Datei base.py mit folgendem Inhalt:
from Products.Five import zcml
from Products.Five import fiveconfigure
from Testing import ZopeTestCase as ztc
from Products.PloneTestCase import PloneTestCase as ptc
from Products.PloneTestCase.layer import onsetup
@onsetup
def setup_vs_policy():
fiveconfigure.debug_mode = True
import vs.policy
zcml.load_config('configure.zcml', vs.policy)
fiveconfigure.debug_mode = False
ztc.installPackage('vs.policy')
setup_vs_policy()
ptc.setupPloneSite(products=['vs.policy'])
class VsPolicyTestCase(ptc.PloneTestCase):
"""This base class is used for all tests in this package.
Utility or setup code can be added if necessary.
"""
Der @onsetup-Decorator sorgt dafür, dass zunächst vs.policy importiert und erst dann eine Plone-Site mit vs.policy aufgesetzt wird. Darüberhinaus wird die configure.zcml-Datei auch dann registriert, wenn kein entsprechender zcml-slug für die Site vorhanden ist.
VsPolicyTestCase ist die Basisklasse für alle Tests in diesem Paket. Bei Bedarf kann hier weiterer Code für das Setup oder Hilfsmethoden eingefügt werden.
Die eigentlichen Unit-Tests werden in der Datei test_setup.py definiert und zu einer Testsuite zusammengestellt:
import unittest
from vs.policy.tests.base import VsPolicyTestCase
from Products.CMFCore.utils import getToolByName
class TestSetup(VsPolicyTestCase):
def test_portal_title(self):
self.assertEquals("Veit Schiele", self.portal.getProperty('title'))
def test_portal_description(self):
self.assertEquals("Welcome to Veit Schiele", self.portal.getProperty('description'))
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestSetup))
return suite
Testen
Der Testrunner kann nun gestartet werden mit:
$ ./bin/instance test -s vs.policy
Wären die Tests geschrieben worden, bevor die Profile erstellt wurden, hätten beide Tests fehlschlagen müssen und der Testrunner folgendes ausgeben:
AssertionError:"Welcome to Veit Schiele != '' ... AssertionError:'Veit Schiele != 'Plone site' Ran 2 tests with 2 failures and 0 errors
Nachdem die Profile angelegt wurden, sollte jedoch keiner der Tests fehlschlagen:
Ran 2 tests with 0 failures and 0 errors.
Plone 4
Ab Zope 2.12 kommt der test-Befehl nicht mehr unmittelbar mit Zope mit. Stattdessen kann ein Buildout-Abschnitt mit zc.recipe.testrunner erstellt werden:
[buildout]
parts =
…
test
…
[test]
recipe = zc.recipe.testrunner
eggs =
Zope2
Plone
${buildout:eggs}
script = test
Anschließend können Sie ein Egg testen z.B. mit:
$ ./bin/test -s vs.policy
Weitere Informationen erhalten Sie in zc.recipe.testrunner

