Prev Next

Chapitre 18. Journalisation

PHPUnit peut produire plusieurs types de fichiers de journalisations (logs).

Résultats de test (XML)

Le fichier de journalisation XML pour les tests produits par PHPUnit est basé sur celui qui est utilisé par la tâche JUnit de l'outil Apache Ant. L'exemple suivant montre que le fichier de journalisation XML généré pour les tests dans TestTableau:

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
  <testsuite name="TestTableau"
             file="/home/sb/TestTableau.php"
             tests="2"
             assertions="2"
             failures="0"
             errors="0"
             time="0.016030">
    <testcase name="testLeNouveauTableauEstVide"
              class="TestTableau"
              file="/home/sb/TestTableau.php"
              line="6"
              assertions="1"
              time="0.008044"/>
    <testcase name="testLeTableauContientUnElement"
              class="TestTableau"
              file="/home/sb/TestTableau.php"
              line="15"
              assertions="1"
              time="0.007986"/>
  </testsuite>
</testsuites>

Le fichier de journalisation XML suivant a été généré pour deux tests, testEchec et testErreur, à partir d'une classe de cas de test nommée EchecErreurTest et montre comment les échecs et les erreurs sont signalés.

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
  <testsuite name="EchecErreurTest"
             file="/home/sb/EchecErreurTest.php"
             tests="2"
             assertions="1"
             failures="1"
             errors="1"
             time="0.019744">
    <testcase name="testFailure"
              class="EchecErreurTest"
              file="/home/sb/EchecErreurTest.php"
              line="6"
              assertions="1"
              time="0.011456">
      <failure type="PHPUnit_Framework_ExpectationFailedException">
testFailure(EchecErreurTest)
Failed asserting that &lt;integer:2&gt; matches expected value &lt;integer:1&gt;.

/home/sb/EchecErreurTest.php:8
</failure>
    </testcase>
    <testcase name="testError"
              class="EchecErreurTest"
              file="/home/sb/EchecErreurTest.php"
              line="11"
              assertions="0"
              time="0.008288">
      <error type="Exception">testError(EchecErreurTest)
Exception:

/home/sb/EchecErreurTest.php:13
</error>
    </testcase>
  </testsuite>
</testsuites>

Résultats de test (TAP)

Le protocole Test Anything Protocol (TAP) est une interface Perl simple au format texte entre les modules de test. L'exemple suivant montre le fichier de journalisation TAP généré pour les tests de TableauTest:

TAP version 13
ok 1 - testNouveauTableauEstVide(TableauTest)
ok 2 - testTableauContientUnElement(TableauTest)
1..2

Le fichier de journalisation TAP a été généré pour deux tests, testEchec et testErreur à partir d'une classe de cas de test nommée EchecErreurTest et montre comme les échecs et les erreurs sont signalés.

TAP version 13
not ok 1 - Failure: testEchec(EchecErreurTest)
  ---
  message: 'Failed asserting that <integer:2> matches expected value <integer:1>.'
  severity: fail
  data:
    got: 2
    expected: 1
  ...
not ok 2 - Error: testErreur(EchecErreurTest)
1..2

Résultats de test (JSON)

La notation objet JavaScript (JavaScript Object Notation ou JSON) est un format léger d'échange de données. L'exemple suivant montre les messages JSON générés pour les tests dans TableauTest:

{"event":"suiteStart","suite":"TableauTest","tests":2}
{"event":"test","suite":"TableauTest",
 "test":"testNouveauTableauEstVide(TableauTest)","status":"pass",
 "time":0.000460147858,"trace":[],"message":""}
{"event":"test","suite":"TableauTest",
 "test":"testTableauContientUnElement(TableauTest)","status":"pass",
 "time":0.000422954559,"trace":[],"message":""}

Les messages JSON suivants ont été générés pour deux tests, testEchec et testErreur, d'une classe de cas de test nommée EchecErreurTest et monte comment les échecs et les erreurs sont signalées.

{"event":"suiteStart","suite":"EchecErreurTest","tests":2}
{"event":"test","suite":"EchecErreurTest",
 "test":"testEchec(EchecErreurTest)","status":"fail",
 "time":0.0082459449768066,"trace":[],
 "message":"Failed asserting that <integer:2> is equal to <integer:1>."}
{"event":"test","suite":"EchecErreurTest",
 "test":"testErreur(EchecErreurTest)","status":"error",
 "time":0.0083680152893066,"trace":[],"message":""}

Couverture de code (XML)

La journalisation au format XML des informations de couverture de code produite par PHPUnit est faiblement basé sur celui utilisé par Clover. L'exemple suivant montre le fichier de journalisation XML généré pour les tests dans CompteBancaireTest:

<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1184835473" phpunit="3.6.0">
  <project name="CompteBancaireTest" timestamp="1184835473">
    <file name="/home/sb/CompteBancaire.php">
      <class name="CompteBancaireException">
        <metrics methods="0" coveredmethods="0" statements="0"
                 coveredstatements="0" elements="0" coveredelements="0"/>
      </class>
      <class name="CompteBancaire">
        <metrics methods="4" coveredmethods="4" statements="13"
                 coveredstatements="5" elements="17" coveredelements="9"/>
      </class>
      <line num="77" type="method" count="3"/>
      <line num="79" type="stmt" count="3"/>
      <line num="89" type="method" count="2"/>
      <line num="91" type="stmt" count="2"/>
      <line num="92" type="stmt" count="0"/>
      <line num="93" type="stmt" count="0"/>
      <line num="94" type="stmt" count="2"/>
      <line num="96" type="stmt" count="0"/>
      <line num="105" type="method" count="1"/>
      <line num="107" type="stmt" count="1"/>
      <line num="109" type="stmt" count="0"/>
      <line num="119" type="method" count="1"/>
      <line num="121" type="stmt" count="1"/>
      <line num="123" type="stmt" count="0"/>
      <metrics loc="126" ncloc="37" classes="2" methods="4" coveredmethods="4"
               statements="13" coveredstatements="5" elements="17"
               coveredelements="9"/>
    </file>
    <metrics files="1" loc="126" ncloc="37" classes="2" methods="4"
             coveredmethods="4" statements="13" coveredstatements="5"
             elements="17" coveredelements="9"/>
  </project>
</coverage>

Couverture de code (TEXTE)

Sortie de couverture de code humainement lisible pour la ligne de commandes ou un fichier texte. Le but de ce format de sortie est de fournir un aperçu rapide de couverture en travaillant sur un petit ensemble de classes. Pour des projets plus grand cette sortie peut être utile pour obtenir un aperçu rapide de la couverture des projets ou quand il est utilisé avec la fonctionnalité --filter. Quand c'est utilisé à partir de la ligne de commande en écrivant sur php://stdout, cela prend en compte le réglage --colors. Ecrire sur la sortie standard est l'option par défaut quand on utilise la ligne de commandes. Par défaut, ceci ne montrera que les fichiers qui ont au moins une ligne couverte. Ceci peut être modifié via l'option de configuration xml showUncoveredFiles Voir la section intitulée « Journalisation ».

Figure 18.1. Sortie de couverture de code en couleurs sur la ligne de commandes

Sortie de couverture de code en couleurs sur la ligne de commandes

Prev Next
1. Automatiser les tests
2. Objectifs de PHPUnit
3. Installer PHPUnit
4. Ecrire des tests pour PHPUnit
Dépendances des tests
Fournisseur de données
Tester des exceptions
Tester les erreurs PHP
Tester la sortie écran
Assertions
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
assertContainsOnly()
assertCount()
assertEmpty()
assertEqualXMLStructure()
assertEquals()
assertFalse()
assertFileEquals()
assertFileExists()
assertGreaterThan()
assertGreaterThanOrEqual()
assertInstanceOf()
assertInternalType()
assertJsonFileEqualsJsonFile()
assertJsonStringEqualsJsonFile()
assertJsonStringEqualsJsonString()
assertLessThan()
assertLessThanOrEqual()
assertNull()
assertObjectHasAttribute()
assertRegExp()
assertStringMatchesFormat()
assertStringMatchesFormatFile()
assertSame()
assertSelectCount()
assertSelectEquals()
assertSelectRegExp()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()
assertTag()
assertThat()
assertTrue()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
5. Le lanceur de tests en ligne de commandes
Options de la ligne de commandes
6. Fixtures
Plus de setUp() que de tearDown()
Variantes
Partager les Fixtures
Etat global
7. Organiser les tests
Composer une suite de tests en utilisant le système de fichiers
Composer une suite de tests en utilisant la configuration XML
8. Tester des bases de données
Systèmes gérés pour tester des bases de données
Difficultés pour tester les bases de données
Les quatre phases d'un test de base de données
1. Nettoyer la base de données
2. Configurer les fixtures
3–5. Exécuter les tests, vérifier les résultats et nettoyer
Configuration d'un cas de test de base de données PHPUnit
Implémenter getConnection()
Implémenter getDataSet()
Qu'en est-il du schéma de base de données (DDL)?
Astuce: utilisez votre propre cas de tests abstrait de base de données
Comprendre DataSets et DataTables
Implémentations disponibles
Attention aux clefs étrangères
Implementer vos propres DataSets/DataTables
L'API de connexion
API d'assertion de base de données
Faire une assertion sur le nombre de lignes d'une table
Faire une assertion sur l'état d'une table
Faire une assertion sur le résultat d'une requête
Faire une assertion sur l'état de plusieurs tables
Foire aux questions
PHPUnit va-t'il (re-)créer le schéma de base de données pour chaque test ?
Suis-je obligé d'utiliser PDO dans mon application pour que l'extension de base de données fonctionne ?
Que puis-je faire quand j'obtiens une erreur « Too much Connections (Trop de connexions) » ?
Comment gérer les valeurs NULL avec les DataSets au format XML à plat / CSV ?
9. Tests incomplets et sautés
Tests incomplets
Sauter des tests
Sauter des tests en utilisant @requires
10. Doublure de test
Bouchons
Objets simulacres (Mock Objects)
Bouchon et simulacre pour Web Services
Simuler le système de fichiers
11. Pratiques de test
Pendant le développement
Pendant le débogage
12. Développement dirigé par les tests
Exemple du compte bancaire
13. Développement dirigé par le comportement
Exemple du jeu de Bowling
14. Analyse de couverture de code
Spécifier les méthodes couvertes
Ignorer des blocs de code
Inclure et exclure des fichiers
Cas limites
15. Autres utilisations des tests
Documentation agile
Tests transverses à l'équipe
16. Générateur de squelette
Générer un squelettre de classe de cas de test
Générer un squelette de classe à partir d'une classe de cas de test
17. PHPUnit et Selenium
Selenium Server
Installation
PHPUnit_Extensions_Selenium2TestCase
PHPUnit_Extensions_SeleniumTestCase
18. Journalisation
Résultats de test (XML)
Résultats de test (TAP)
Résultats de test (JSON)
Couverture de code (XML)
Couverture de code (TEXTE)
19. Etendre PHPUnit
Sous-classe PHPUnit_Framework_TestCase
Ecrire des assertions personnalisées
Implémenter PHPUnit_Framework_TestListener
Sous classer PHPUnit_Extensions_TestDecorator
Implémenter PHPUnit_Framework_Test
A. Assertions
B. Annotations
@author
@backupGlobals
@backupStaticAttributes
@codeCoverageIgnore*
@covers
@coversNothing
@dataProvider
@depends
@expectedException
@expectedExceptionCode
@expectedExceptionMessage
@group
@outputBuffering
@requires
@runTestsInSeparateProcesses
@runInSeparateProcess
@test
@testdox
@ticket
C. Le fichier de configuration Configuration
PHPUnit
Série de tests
Groupes
Inclure et exclure des fichiers de la couverture de code
Journalisation
Moniteurs de tests
Configurer les réglages de PHP INI, les constantes et les variables globales
Configurer les navigateurs pour Selenium RC
D. Index
Index
E. Bibliographie
F. Copyright