Tests en Perl

Sébastien Aperghis-Tramoni, sebastien@aperghis.net

Tests en Perl

  • Place très importante des tests dans le cycle de développement

    • de Perl même, plus de 11 000 tests unitaires

    • des modules CPAN, exécutés avant l'installation

Fonctionnement

  • Principe émetteur - récepteur

Le protocole TAP

  • Protocole unidirectionnel

  • Suite de ok et not ok

  • Combiné avec les directives SKIP et TODO

  • Fournit des sémantiques équivalentes aux extensions DejaGnu de POSIX 1003.3

    • ok - PASS - le test est passé avec succès

    • not ok - FAIL - le test a échoué

    • ok # SKIP - SKIP - le test a été délibérément sauté

    • not ok # TODOFAIL - le test a échoué de manière attendue

    • ok # TODOPASS - le test a réussi alors qu'on s'attendait à ce qu'il échoue

Émission

  • Première vertu du programmeur : paresse

  • Modules générateurs de TAP

  • Temps Anciens, utilisation de magie noire

  • Moyen-Âge, utilisation de Test.pm

  • Temps Modernes, utilisation de Test::More et dérivés

Test::More

  • Fournit des sémantiques de haut niveau

  • Vérification booléenne : ok()

        ok( defined $reservoir,  "\$reservoir est défini" );
  • Vérification d'égalité ou d'inégalité : is(), isnt()

        is( $reservoir->type_carburant(), 'cosmogol',  "type de carburant" );
        isnt( ref $shadok, 'Gibi',  "un Shadok n'est pas un Gibi" );
  • Vérification par correspondance : like(), unlike()

        like( $numero, '/^(?:bu|zo|meu)(?:ga|bu|zo|meu)$/', 
          "le numéro est-il une séquence valide ?" );

Test::More - Sémantiques

  • Vérification de structure : is_deeply()

        is_deeply(
            $trajet, 
            [ "Prima", "Dua", "Tierza" ]
            "vérification du trajet", 
        );
  • Vérification de chargement : use_ok(), require_ok()

        # chargement d'un fichier
        require_ok('init.pl');
        # chargement d'un module
        require_ok('Rocket::Engine');
        # importation d'un module
        use_ok('Rocket::Engine');

Test::More - Échecs de tests

  • Sémantique permet d'offrir des erreurs détaillées

  • Exemple : échec d'un is()

        not ok 17 - type de carburant
        #     Failed test (t/reservoir.t at line 53)
        #          got: 'essence ordinaire'
        #     expected: 'cosmogol'
  • Exemple : échec d'un require_ok()

        not ok 3 - require Rocket::Engine;
        #     Failed test (-e at line 1)
        #     Tried to require 'Rocket::Engine'.
        #     Error:  Can't locate Rocket/Engine.pm in @INC

Réception

  • Analyse du flux TAP par Test::Harness

  • Fournit une vision condensée de la session de test

  • Exécution par make test

        $ make test
        t/00_basic........# testing Regexp::Assemble v0.15
        t/00_basic........ok
        t/01_insert.......ok
        t/02_reduce.......ok
        t/03_str..........ok
        t/04_match........ok 9582/14861
  • Exécution par prove :

        $ prove -b t/01api.t

Test::Harness

  • Définit le protocole TAP

  • En cours de récriture totale

    • Euphémisme poli pour signifier que Test::Harness sera abandonné et remplacé par un nouvel environnement

  • TAP 2.0

    • Encore en cours de développement

    • Mais des analyseurs déjà disponibles

    • TAP::Parser par Michael Schwern

    • TAPx:::Parser par Curtis Poe (Ovid)

Bibliographie

  • Perl Testing: A Developer's Notebook

    par Ian Langworth et chromatic,

    O'Reilly & Associates, 2005, ISBN 0-596-10092-2

Bibliographie

  • Perl Best Practices

    par Damian Conway,

    O'Reilly & Associates, 2005, ISBN 0-596-00173-8

Bibliographie

  • Les tests en Perl - Présentation et modules standards

    par Sébastien Aperghis-Tramoni et Philippe Blayo,

    GNU/Linux Magazine France n°88, novembre 2006

Questions ?

Merci