Prev Next

Annexe B. Annotations

Une annotation est une forme spéciale de méta donnée syntaxique qui peut être ajoutée au code source de certains langages de programmation. Bien que PHP n'ait pas de fonctionnalité dédiée à l'annotation du code source, l'utilisation d'étiquettes telles que @annotation paramètres dans les blocs de documentation s'est établi dans la communauté PHP pour annoter le code source. En PHP, les blocs de documentation sont réflexifs: ils peuvent être accédés via la méthode de l'API de réflexivité getDocComment() au niveau des fonctions, classes, méthodes et attributs. Des applications telles que PHPUnit utilisent ces informations durant l'exécution pour adapter leur comportement.

Cette annexe montre toutes les sortes d'annotations gérées par PHPUnit.

@assert

Vous pouvez utiliser l'annotation @assert dans le bloc de documentation d'une méthode pour générer automatiquement des tests simples mais significatifs au lieu des cas de test incomplets quand on utilise le générateur de squelette (voir Chapitre 16, Générateur de squelette):

/**
 * @assert (0, 0) == 0
 */
public function additionne($a, $b)
{
    return $a + $b;
}

Ces annotations sont transformés en code de test comme

/**
 * Generated from @assert (0, 0) == 0.
 */
public function testAdditionne() {
    $o = new Calculateur;
    $this->assertEquals(0, $o->additionne(0, 0));
}

@author

L'annotation @author est un alias pour l'annotation @group (voir la section intitulée « @group ») et permet de filtrer des tests selon leurs auteurs.

@backupGlobals

Les opérations de sauvegarde et de restauration des variables globales peuvent être complètement désactivées pour tous les tests d'une classe de cas de test comme ceci :

/**
 * @backupGlobals disabled
 */
class MonTest extends PHPUnit_Framework_TestCase
{
    // ...
}

L'annotation @backupGlobals peut également être utilisée sur les opérations de sauvegarde et de restauration :

/**
 * @backupGlobals disabled
 */
class MonTest extends PHPUnit_Framework_TestCase
{
    /**
     * @backupGlobals enabled
     */
    public function testQuiIntergitAvecDesVariablesGlobales()
    {
        // ...
    }
}

@backupStaticAttributes

Les opérations de sauvegarde et de restauration pour les attributs statiques des classes peuvent être complètement désactivés pour tous les tests d'une classe de cas de test comme ceci :

/**
 * @backupStaticAttributes disabled
 */
class MonTest extends PHPUnit_Framework_TestCase
{
    // ...
}

L'annotation @backupStaticAttributes peut également être utilisée au niveau d'une méthode de test. Ceci permet une configuration plus fine des opérations de sauvegarde et de restauration:

/**
 * @backupStaticAttributes disabled
 */
class MonTest extends PHPUnit_Framework_TestCase
{
    /**
     * @backupStaticAttributes enabled
     */
    public function testQuiInteragitAvecDesAttributsStatiques()
    {
        // ...
    }
}

@codeCoverageIgnore*

Les annotations @codeCoverageIgnore, @codeCoverageIgnoreStart et @codeCoverageIgnoreEnd peuvent être utilisées pour exclure des lignes de code de l'analyse de couverture.

Pour la manière de les utiliser, voir la section intitulée « Ignorer des blocs de code ».

@covers

L'annotation @covers peut être utilisée dans le code de test pour indique quelle(s) méthode(s) un test veut tester:

/**
 * @covers CompteBancaire::getBalance
 */
public function testBalanceEstInitiallementAZero()
{
    $this->assertEquals(0, $this->ba->getBalance());
}

Si elle est fournie, seule l'information de couverture de code pour la(les) méthode(s) sera prise en considération.

Tableau B.1, « Annotations pour indiquer quelles méthodes sont couvertes par un test » montre la syntaxe de l'annotation @covers.

Tableau B.1. Annotations pour indiquer quelles méthodes sont couvertes par un test

Annotation Description
@covers NomClasse::nomMethode Indique que la méthode de test annotée couvre la méthode indiquée.
@covers NomClasse Indique que la méthode de test annotée couvre toutes les méthodes d'une classe donnée.
@covers NomClasse<extended> Indique que la méthode de test annotée couvre toutes les méthodes d'une classe donnée ainsi que les classe(s) et interface(s) parentes.
@covers NomClasse::<public> Indique que la méthode de test annotée couvre toutes les méthodes publiques d'une classe donnée.
@covers NomClasse::<protected> Indique que la méthode de test annotée couvre toutes les méthodes protected d'une classe donnée.
@covers NomClasse::<private> Indique que la méthode de test annotée couvre toutes les méthodes privées d'une classe donnée.
@covers NomClasse::<!public> Indique que la méthode de test annotée couvre toutes les méthodes d'une classe donnée qui ne sont pas publiques.
@covers NomClasse::<!protected> Indique que la méthode de test annotée couvre toutes les méthodes d'une classe donnée qui ne sont pas protected.
@covers NomClasse::<!private> Indique que la méthode de test annotée couvre toutes les méthodes d'une classe donnée qui ne sont pas privées.

@dataProvider

Une méthode de test peut accepter des paramètres arbitraires. Ces paramètres peuvent être fournis pas une méthode fournisseuse de données ( (provider() dans Exemple 4.4, « Utiliser un fournisseur de données qui renvoie un tableau de tableaux »). La méthode fournisseur de données peut être indiquée en utilisant l'annotation @dataProvider.

Voir la section intitulée « Fournisseur de données » pour plus de détails.

@depends

PHPUnit gère la déclaration des dépendances explicites entre les méthodes de test. De telles dépendances ne définissent pas l'ordre dans lequel les méthodes de test doivent être exécutées mais elles permettent de retourner l'instance d'une fixture de test par un producteur et de la passer aux consommateurs dépendants. Exemple 4.2, « Utiliser l'annotation @depends pour exprimer des dépendances » montre comment utiliser l'annotation @depends pour exprimer des dépendances entre méthodes de test.

Voir la section intitulée « Dépendances des tests » pour plus de détails.

@expectedException

Exemple 4.7, « Utiliser l'annotation @expectedException » montre comment utiliser l'annotation @expectedException pour tester si une exception est levée dans le code testé.

Voir la section intitulée « Tester des exceptions » pour plus de détails.

@expectedExceptionCode

L'annotation @expectedExceptionCode, en conjonction avec @expectedException permet de faire des assertions sur le code d'erreur d'une exception levée ce qui permet de cibler une exception particulière.

class MonTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException     MonException
     * @expectedExceptionCode 20
     */
    public function testExceptionAUnCodeErreur20()
    {
        throw new MonException('Un message', 20);
    }
}

@expectedExceptionMessage

L'annotation @expectedExceptionMessage fonctionne de manière similaire à @expectedExceptionCode en ce qu'il vous permet de faire une assertion sur le message d'erreur d'une exception.

class MonTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException        MonException
     * @expectedExceptionMessage Un message
     */
    public function testExceptionALeBonMessage()
    {
        throw new MonException('Un message', 20);
    }
}

Le message attendu peut être une partie d'une chaîne d'un message d'exception. Ceci peut être utile pour faire une assertion sur le fait qu'un nom ou un paramètre qui est passé s'affiche dans une exception sans fixer la totalité du message d'exception dans le test.

class MonTest extends PHPUnit_Framework_TestCase
{
     /**
      * @expectedException        MonException
      * @expectedExceptionMessage cassé
      */
     public function testExceptionALeBonMessage()
     {
         $param = "cassé";
         throw new MonException('Paramètre "'.$param.'" incorrect.', 20);
     }
}

@group

Un test peut être marqué comme appartement à un ou plusieurs groupes en utilisant l'annotation @group comme ceci

class MonTest extends PHPUnit_Framework_TestCase
{
    /**
     * @group specification
     */
    public function testQuelquechose()
    {
    }

    /**
     * @group regresssion
     * @group bug2204
     */
    public function testAutreChose()
    {
    }
}

Des tests peuvent être sélectionnés pour l'exécution en se basant sur les groupes en utilisant les options --group et --exclude-group du lanceur de test en ligne de commandes ou en utilisant les directives respectives du fichier de configuration XML.

@outputBuffering

L'annotation @outputBuffering peut être utilisée pour contrôler le tampon de sortie de PHP comme ceci

/**
 * @outputBuffering enabled
 */
class MonTest extends PHPUnit_Framework_TestCase
{
    // ...
}

L'annotation @outputBuffering peut également être utilisé au niveau de la méthode de test. Ceci permet un contrôle plus fin sur le tampon de sortie :

/**
 * @outputBuffering disabled
 */
class MonTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering enabled
     */
    public function testQuiAfficheQuelqueChose()
    {
        // ...
    }
}

@runTestsInSeparateProcesses


            

@runInSeparateProcess


            

@test

Comme alternative à préfixer vos noms de méthodes de test avec test, vous pouvez utiliser l'annotation @test dans le bloc de documentation d'une méthode pour la marquer comme méthode de test.

/**
 * @test
 */
public function balanceInitialeDoitEtre0()
{
    $this->assertEquals(0, $this->ba->getBalance());
}

@testdox


            

@ticket


            
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()
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
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
@assert
@author
@backupGlobals
@backupStaticAttributes
@codeCoverageIgnore*
@covers
@dataProvider
@depends
@expectedException
@expectedExceptionCode
@expectedExceptionMessage
@group
@outputBuffering
@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