Funktionale Tests
Für vs.registration wurde in der README.txt-Datei ein funktionaler Test für zope.testbrowser geschrieben, in dem die grundlegenden Funktionen der beiden Artikeltypen beschrieben sind. zope.testbrowser-Tests simulieren die Interaktion eines Nutzers in einem Web-Browser (jedoch ohne Javascript-Unterstützung). Dabei gibt es eine relativ einfache API zum Ausfüllen von Formularfeldern, zum Klicken auf Links und Tasten sowie zum Überprüfen der Inhalte der dargestellten Seiten. Um mehr über solche funktionalen Tests zu erfahren, können Sie sich einfach die Datei src/vs.registration/README.txt anschauen.
Zunächst wird jedoch wieder eine Basisklasse für funktionale Tests in src/vs.registration/vs/registration/tests/base.py geschreiben:
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_registration():
fiveconfigure.debug_mode = True
import vs.registration
zcml.load_config('configure.zcml', vs.registration)
fiveconfigure.debug_mode = False
ztc.installPackage('vs.registration')
setup_vs_registration()
ptc.setupPloneSite(products=['vs.registration'])
...
class RegistrationFunctionalTestCase(ptc.FunctionalTestCase):
"""Test case class used for functional (doc-)tests
"""
RegistrationFunctionalTestCase verwendet dabei PloneTestCase.FunctionalTestCase als Basisklasse. Damit nun solch ein funktionaler Test aufgerufen werden kann, wird tests/test_doctest.py mit folgendem Inhalt erstellt:
import unittest
import doctest
from zope.testing import doctestunit
from zope.component import testing, eventtesting
from Testing import ZopeTestCase as ztc
from vs.registration.tests import base
def test_suite():
return unittest.TestSuite([
ztc.ZopeDocFileSuite(
'README.txt', package='vs.registration',
test_class=base.RegistrationFunctionalTestCase,
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE | doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS),
])
Damit stehen nun auch die Hilfsmethoden von PloneTestCase in Doctests zur Verfügung.
Die README.txt-Datei selbst beginnt mit der Konfiguration des zope.testbrowser:
>>> from Products.Five.testbrowser import Browser >>> browser = Browser() >>> portal_url = self.portal.absolute_url() >>> browser.handleErrors = False >>> self.portal.error_log._ignored_exceptions = ()
Die letzten beiden Zeilen erleichtern das Schreiben und Debuggen von testbrowser-Tests.
Anschließend melden wir uns als Eigentümer der Plone-Site über die login_form-Seite an:
>>> from Products.PloneTestCase.setup import portal_owner, default_password >>> browser.open(portal_url + '/login_form?came_from=' + portal_url) >>> browser.getControl(name='__ac_name').value = portal_owner >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click()
So können Sie sich auch den weiteren Test durchlesen und herausfinden, wie neue Inhalte erstellt und deren Ausgabe überprüft wird.
Debugging
Soll der Status des browser-Objekts für jede Zeile angezeigt werden können, wird ein breakpoint gesetzt mit:
>>> import pdb; pdb.set_trace()
- browser.url
- ist die aktuelle URL;
- browser.contents
ist die gerenderte HTML-Seite der aktuellen URL.
Da das Lesen von HTML-Code in der Konsole mühsam sein kann, kann man sich mit folgendem Code die Ausgabe in eine Datei schreiben lassen:
>>> open('/tmp/test-output.html', 'w').write(browser.contents)
Zum Weiterlesen
Weitere Informationen finden Sie in Funktionale und Systemtests mit zope.testbrowser.

