Prev Next

Chapitre 9. Tests incomplets et sautés

Tests incomplets

Quand vous travaillez sur une nouvelle classe de cas de test, vous pourriez vouloir commencer en écrivant des méthodes de test vides comme

public function testQuelquechose()
{
}

pour garder la trace des tests que vous avez à écrire. Le problème avec les méthodes de test vides est qu'elles sont interprétées comme étant réussies par le framework PHPUnit. Cette mauvaise interprétation fait que le rapport de tests devient inutile -- vous ne pouvez pas voir si un test est effectivement réussi ou s'il n'a tout simplement pas été implémenté. Appeler $this->fail() dans une méthode de test non implémentée n'aide pas davantage, puisqu'alors le test sera interprété comme étant un échec. Ce serait tout aussi faux que d'interpréter un test non implémenté comme étant réussi.

Si nous pensons à un test réussi comme à un feu vert et à un échec de test comme à un feu rouge, nous avons besoin d'un feu orange additionnel pour signaler un test comme étant incomplet ou pas encore implémenté. PHPUnit_Framework_IncompleteTest est une interface de marquage pour signaler une exception qui est levée par une méthode de test comme résultat d'un test incomplet ou actuellement pas implémenté. PHPUnit_Framework_IncompleteTestError est l'implémentation standard de cette interface.

Exemple 9.1, « Signaler un test comme incomplet » montre une classe de cas de tests, ExempleDeTest, qui contient une unique méthode de test, method, testSomething(). En appelant la méthode pratique markTestIncomplete() (qui lève automatiquement une exception PHPUnit_Framework_IncompleteTestError) dans la méthode de test, nous marquons le test comme étant incomplet.

Exemple 9.1. Signaler un test comme incomplet

<?php
class ExempleDeTest extends PHPUnit_Framework_TestCase
{
public function testeQuelquechose()
{
// Facultatif: testez tout ce que vous voulez ici.
$this->assertTrue(TRUE, 'Ceci devrait toujours fonctionner.');

// Cesser ici et marquer ce test comme incomplet.
$this->markTestIncomplete(
'Ce test n'a pas encore été implémenté.'
);
}
}
?>

Un test incomplet est signalé par un I sur la sortie écran du lanceur de test en ligne de commandes PHPUnit, comme montré dans l'exemple suivant.

phpunit --verbose ExempleDeTest
PHPUnit 3.7.0 by Sebastian Bergmann.

I

Time: 0 seconds, Memory: 3.75Mb

There was 1 incomplete test:

1) ExempleDeTest::testQuelquechose
This test has not been implemented yet.

/home/sb/ExempleDeTest.php:12
OK, but incomplete or skipped tests!
Tests: 1, Assertions: 1, Incomplete: 1.

Tableau 9.1, « API pour les tests incomplets » montre l'API pour marquer des tests comme incomplets.

Tableau 9.1. API pour les tests incomplets

Méthode Signification
void markTestIncomplete() Marque le test courant comme incomplet.
void markTestIncomplete(string $message) Marque le test courant comme incomplet en utilisant $message comme message d'explication.

Sauter des tests

Tous les tests ne peuvent pas être exécutés dans tous les environnements. Considérez, par exemple, une couche d'abstraction de base de données qui possède différents pilotes pour les différents systèmes de base de données qu'elle gère. Les tests pour le pilote MySQL ne peuvent bien sûr être exécutés que si un serveur MySQL est disponible.

Exemple 9.2, « Sauter un test » montre une classe de cas de tests, DatabaseTest, qui contient une méthode de tests testConnection(). Dans la méthode canevas setUp() de la classe du cas de test, nous pouvons contrôler si l'extension MySQLi est disponible et utiliser la méthode markTestSkipped() pour sauter le test si ce n'est pas le cas.

Exemple 9.2. Sauter un test

<?php
class DatabaseTest extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
if (!extension_loaded('mysqli')) {
$this->markTestSkipped(
'L\'extension MySQLi n\'est pas disponible.'
);
}
}

public function testConnection()
{
// ...
}
}
?>

Un test qui a été sauté est signalé par un S dans la sortie écran du lanceur de tests en ligne de commande PHPUnit, comme montré dans l'exemple suivant.

phpunit --verbose DatabaseTest
PHPUnit 3.7.0 by Sebastian Bergmann.

S

Time: 0 seconds, Memory: 3.75Mb

There was 1 skipped test:

1) DatabaseTest::testConnection
The MySQLi extension is not available.

/home/sb/DatabaseTest.php:9
OK, but incomplete or skipped tests!
Tests: 1, Assertions: 0, Skipped: 1.

Tableau 9.2, « API pour sauter des tests » montre l'API pour sauter des tests.

Tableau 9.2. API pour sauter des tests

Méthode Signification
void markTestSkipped() Marque le test courant comme sauté.
void markTestSkipped(string $message) Marque le test courant comme étant sauté en utilisant $message comme message d'explication.

Sauter des tests en utilisant @requires

En plus des méthodes ci-dessus, il est également possible d'utiliser l'annotation @requires pour exprimer les préconditions communes pour un cas de test.

Tableau 9.3. Usages possibles de @requires

Type Valeurs possibles Exemple Autre exemple
PHP Tout identifiant de version PHP @requires PHP 5.3.3 @requires PHP 5.4-dev
PHPUnit Tout identifiant de version PHPUnit @requires PHPUnit 3.6.3 @requires PHPUnit 3.7
function Tout paramètre valide pour function_exists @requires function imap_open @requires function ReflectionMethod::setAccessible
extension Tout nom d'extension @requires extension mysqli @requires extension curl

Exemple 9.3. Sauter des cas de tests en utilisant @requires

<?php
/**
* @requires extension mysqli
*/
class DatabaseTest extends PHPUnit_Framework_TestCase
{
/**
* @requires PHP 5.3
*/
public function testConnection()
{
// Test qui nécessite l'extension mysqli et PHP >= 5.3
}

// ... Tous les autres tests nécessitent l'extension mysqli
}
?>

Si vous utilisez une syntaxe qui ne compile pas avec une version données de PHP, regardez dans la configuration xml pour les inclusions dépendant de la version dans la section intitulée « Série de tests »

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