TP6
Techniques mises en oeuvre
- Tests unitaires PHPUnit
- TDD (Test Driven Development)
- Refactoring (réusinage
de code)
- envoi de mail
Expression des besoins
On veut pouvoir tester le site facilement, notamment pour s'assurer que
les modifications apportées
régulièrement au code source n'introduisent pas
des régressions. On doit donc développer des
batteries de tests unitaires UnitTestCase. On
aimerait bien pouvoir tester aussi automatiquement tous les
enchainements d'écran du site web en
écrivant des test de recettes web WebTestCase.
Le responsable d'une application doit recevoir un courrier
électronique lorsque qu'un ticket relatif à
l'application
dont il a la responsabilité est créé
(le mail du
responsable est aussi spécifié dans le fichier
app.csv qui contient désormais par exemple :
1;Paye
;paye@cnam.fr
2;Inscriptions;inscriptions@cnam.fr
3;mon appli
;moi@cnam.fr
).
Travail demandé
Test Unitaire de la classe Product
Définir (dans un fichier appelé
ProductTest.class.php,
dans le même
répertoire que Product.class.php) la classe de tests ProductTest. Cette classe doit
définir les
méthodes
de test suivantes : testGetMail, testSetMail, testCheckMailWithValidLength,
testCheckTooShortMail, testCheckMailWithoutArrobas, testCheckMailDomain,
testCheckMailName, ....
Définir (dans un fichier Product.class.php) la classe
Product
qui a pour attributs les
différentes infos associées à une
application : id, name et mail.
Définir également dans cette classe
Product un constructeur (Product($name, $mail, $id = -1)), les
accesseurs getMail() et
setMail($mail).
Important : le but est de développer la classe Product avec une approche TDD.
Implémenter la méthode checkMail itérativement,
- en faisant (échouer puis) passer successivement les tests
testCheckMailWithValidLength, testCheckTooLongMail,
testCheckMailWithoutArrobas, ...-, ... et en respectant la
documentation suivante:
/**
* check a mail address
*
* check the correctness of length, domain and contents
* of a mail address
*
* @param string $mail mail address to check
* if this $mail parameter is '', check
the mail
* atribute of the current object
* @return boolean true if mail OK, false else
*/
function checkMail($mail = '') {
if ( $mail == '' )
$mail = $this->mail;
// 1. tests sur longueur
// TODO
Plus précisément, une adresse mail (nom@domaine)
sera
considérée comme valable si elle
vérifie chacune des conditions suivantes :
- sa longueur est supérieure à 10 et
inférieure à 35,
- contient un arrobase '@',
- la partie domaine se termine par .fr,
- la partie nom ne contient que des lettres de a à
z et/ou des points ou tirets (indication : utiliser le masque '/^[a-zA-Z.-]+$/' avec preg_match).
Test Unitaire de la classe FileProductDAO
A l'image de la
classe FileTicketDAO qui est responsable de lire/écrire dans un
fichier csv les instances de Ticket, la classe FileProductDAO va
permettre d'accéder à des instances de Product
stokées dans le fichier texte app.csv .
Ecrire cette classe FileProductDAO qui satisfait le test unitaire
FileProductDAOTest qui est fourni dans le
fichier FileProductDAOTest.class.php .
Notez que FileProductDAO définit un constructeur ayant un
paramètre optionnel :
FileProductDAO($productFile='app.csv'), constructeur appelé par la classe de test :
class FileProductDAOTest extends UnitTestCase {
private $dao; // fixture
function setUp() {
$this->dao = new FileProductDAO('app_test.csv');
}
Le fichier app_test.csv utilisé par le test est le suivant :
1;Paye
;paye@cnam.fr
2;Inscriptions;inscriptions@cnam.fr
3;mon appli
;moi@cnam.fr
Refactoring de editTicket.php pour utiliser AppService
La page editTicket.php
contient du code qu'on va déplacer vers la couche
Service dans la classe AppService.
Dans la classe AppService
définir l'attribut _productDAO (à initialiser dans le constructeur) et les nouvelles méthodes :
- getAppList() (à supprimer de editTicket.php et
à adapter pour utiliser la classe FileProductDAO)
- getAllApplisAsOptions() (à supprimer
de editTicket.php et
à adapter),
- getProductMailFromName($productName),
- sendMailForTicket($ticket).
Dans la page
editTicket.php utiliser une
méthode de la classe AppService pour
initialiser $allApplisAsOptions.
Dans la page
editTicketAction.php utiliser la
méthode sendMailForTicket($ticket) de la classe AppService pour
prévenir le responsable de l'application de la
création d'un nouveau ticket.