Direkt zum Inhalt | Direkt zur Navigation

Benutzerspezifische Werkzeuge
Anmelden
Sektionen
Sie sind hier: Startseite Dienstleistungen Schulungen Testen Testabdeckung (Code Coverage)

Testabdeckung (Code Coverage)

Der Zope Test Runner ermöglicht auch, die Testabdeckung eines Produkts zu ermitteln:

./bin/instance test -s vs.registration --coverage=coverage

Für eine schnelle Statusübersicht erhalten Sie folgendes Ergebnis:

lines   cov%   module   (path)
   14    57%   vs.registration.__init__   (/home/veit/plone_testing/src/vs.registration/vs/registration/__init__.py)
    7   100%   vs.registration.browser.registrant   (/home/veit/plone_testing/src/vs.registration/vs/registration/browser/registrant.py)
   26    76%   vs.registration.browser.registration   (/home/veit/plone_testing/src/vs.registration/vs/registration/browser/registration.py)
   37   100%   vs.registration.content.registrant   (/home/veit/plone_testing/src/vs.registration/vs/registration/content/registrant.py)
   33   100%   vs.registration.content.registration   (/home/veit/plone_testing/src/vs.registration/vs/registration/content/registration.py)
   22   100%   vs.registration.interfaces   (/home/veit/plone_testing/src/vs.registration/vs/registration/interfaces.py)
   25    96%   vs.registration.setuphandlers   (/home/veit/plone_testing/src/vs.registration/vs/registration/setuphandlers.py)
   17   100%   vs.registration.tests.base   (/home/veit/plone_testing/src/vs.registration/vs/registration/tests/base.py)
   12    91%   vs.registration.tests.test_doctest   (/home/veit/plone_testing/src/vs.registration/vs/registration/tests/test_doctest.py)

Ausführlichere Informationen für jede Testdatei sind im Verzeichnis coverage enthalten, z.B. für vs.registration.browser.registration in coverage/vs.registration.browser.registration.cover:

       """Define a browser view for the Registration content type. In the FTI
       configured in profiles/default/types/*.xml, this is being set as the default
       view of that content type.
    1: """

    1: from Acquisition import aq_inner
    1: from Products.Five.browser import BrowserView
    1: from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile

    1: from Products.CMFCore.utils import getToolByName

    1: from vs.registration.interfaces import IRegistration
    1: from vs.registration.interfaces import IRegistrant

    1: from plone.memoize.instance import memoize

    2: class RegistrationView(BrowserView):
           """Default view of a registration
           """

           # This template will be used to render the view. An implicit variable
           # 'view' will be available in this template, referring to an instance
           # of this class. The variable 'context' will refer to the registration
           # being rendered.

    1:     __call__ = ViewPageTemplateFile('registration.pt')

    1:     @memoize
            def registrations(self):
>>>>>>         context = aq_inner(self.context)
>>>>>>         catalog = getToolByName(context, 'portal_catalog')
>>>>>>         return [ dict(url=registration.getURL(),
                             title=registration.Title,
                             description=registration.Description,)
                        for registration in
                           catalog(object_provides=IRegistration.__identifier__,
>>>>>>                             path=dict(query='/'.join(context.getPhysicalPath()),
>>>>>>                                       depth=1),
>>>>>>                             sort_on='sortable_title')
                      ]

…

Dies entspricht exakt der Datei, jedoch ist den meisten Zeilen eine Zahl vorangestellt:

n
diese Zeile wurde n-mal aufgerufen.
>>>>>>
diese Zeile wurde nicht aufgerufen.

Die Anzahl der durch den Test nicht aufgerufenen Zeilen durch die gesamte Anzahl der Zeilen ergibt die Testabdeckung in Prozent.

Testabdeckung für mehrere Eggs

Auch für mehrere Eggs lässt sich die Testabdeckung mit zc.recipe.testrunner angeben:

[buildout]
…
parts =
    …
    test
    coverage-test

[test]
recipe = zc.recipe.testrunner
eggs =
    ${instance:eggs}

[coverage-test]
recipe = zc.recipe.testrunner
eggs = ${test:eggs}
defaults = ['--coverage', '../../coverage', '-v', '--auto-progress']
environment = environment

Report erstellen

z3c.coverage erstellt einen übersichtlichen Report mit Graphen. Um einen solchen Report zu erhalten, kann einfach ein entsprechender Abschnitt in der buildout.cfg-Datei eingetragen werden:

[buildout]
…
parts =
    …
    test
    coverage-test
    coverage-report

[test]
recipe = zc.recipe.testrunner
eggs = z3c.coverage [test]
defaults = ['--ndiff']

[coverage-test]
recipe = zc.recipe.testrunner
eggs = z3c.coverage [test]
defaults = ['--ndiff', '--coverage', '../../coverage']

[coverage-report]
recipe = zc.recipe.egg
eggs = z3c.coverage
scripts = coverage
arguments = ('coverage', 'coverage/report')

Anschließend können Sie coverage/report/all.html in Ihrem Browser öffnen und erhalten einen übersichtlichen Report:

Report