Benutzerspezifische Werkzeuge
Sie sind hier: Startseite Artikeltypen Funktionale Tests

Funktionale Tests

erstellt von Veit Schiele zuletzt verändert: 13.09.2009 19:32 © Veit Schiele 2007–2008

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)
Artikelaktionen