banniere.png

LaTeX exécutable en doctest Python

Pour un nouveau projet, je dois pouvoir exécuter des tests fonctionnels Zope 3 contenus dans des exemples de code dans des fichiers au format LaTeX.

Les fichiers LaTeX peuvent bien sûr être appelés directement, mais l'objectif était de pouvoir marquer certains exemples de code "à tester", "à ne pas tester", pour plus de souplesse.

Le module textest fourni  un set minimal de classes et fonctions qui permet d'utiliser des fichiers LaTeX comme doctests fonctionnels, avec une extraction à la volée des sections Verbatim.

Il peut être ensuite utilisé dans un script de test, pour que le script de test de Zope 3 exécute l'ensemble des tests. Ce script est une copie du script que l'on trouve dans le module zope.testing.functional, avec quelques modifications,  et une petite boucle sur les fichiers *.tex du répertoire courant.

Exemple de script:
import doctest
import os
import unittest
from zope.app.testing import setup, functional
from textest import TexFileSuite

def FunctionalTexFileSuite(filename, **kw):
    globs = kw.setdefault('globs', {})
    globs['http'] = functional.HTTPCaller()
    globs['getRootFolder'] = functional.getRootFolder
    globs['sync'] = functional.sync
    kw['package'] = doctest._normalize_module(kw.get('package'))

    kwsetUp = kw.get('setUp')
    def setUp(test):
        functional.FunctionalTestSetup().setUp()
        setup.setUpTestAsModule(test, filename.replace('.', '_'))
        if kwsetUp is not None:
            kwsetUp(test)

    kw['setUp'] = setUp

    kwtearDown = kw.get('tearDown')
    def tearDown(test):
        if kwtearDown is not None:
            kwtearDown(test)
        try:
            setup.tearDownTestAsModule(test)
        except KeyError:
            # XXX see why
            pass
        functional.FunctionalTestSetup().tearDown()

    kw['tearDown'] = tearDown

    if 'optionflags' not in kw:
        old = doctest.set_unittest_reportflags(0)
        doctest.set_unittest_reportflags(old)
        kw['optionflags'] = (old
                             | doctest.ELLIPSIS
                             | doctest.REPORT_NDIFF
                             | doctest.NORMALIZE_WHITESPACE)

    suite = TexFileSuite(filename, **kw)
    suite.layer = functional.Functional
    return suite


current_folder = os.path.dirname(__file__)
if current_folder == '':
    current_folder = '.'

def test_suite():
    extractor = doctest.DocTestParser()

    files = [file for file in os.listdir(current_folder)
             if file.endswith('.tex')]

    tests = [FunctionalTexFileSuite(file) for file in files]
    return unittest.TestSuite(tests)

if __name__ == '__main__':
    import unittest
    unittest.main(defaultTest='test_suite')

Ce système peut être perfectionné et rendu générique, pour fonctionner avec tout type de format (OOo, Doc, etc..)

Vous aimez ce post ? partagez-le :


Trackback URL | Categories: coding, documentation 0 comments

Tarek Ziadé. Copyright 2006. Tous droits réservés. Licence contenu site
BuzTrucs
Add to Technorati Favorites