Vous êtes sur la page 1sur 31

Modularit Tests unitaires Documentation Conclusion e

Modularit, tests unitaires et documentation en Pascal e I3 Algorithmique


Nicolas Delestre

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

1 / 31

Modularit Tests unitaires Documentation Conclusion e

Plan

Modularit e

Tests unitaires

Documentation

Conclusion

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

2 / 31

Modularit Tests unitaires Documentation Conclusion e

Constats

La programmation structure facilite la rutilisabilit e e e


Par exemple pour le dveloppement du programme de chirement de e Vigen`re nous avons rutilis certaines fonctions provenant du e e e programme de chirement de Csar e

Mais pour linstant en Pascal, nous avons rutilis des e e fonctions/procdures dans dirents programmes en faisant un e e copier/coller . Ce nest pas satisfaisant car :
on duplique du code (une future erreur sera ` corriger n fois) a on risque dajouter de nouvelles erreurs

Il faudrait pouvoir inclure des types et/ou des sous-programmes (fonctions/procdures) dans un programme e Cest le rle des Units Pascal (unit) o e
Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

3 / 31

Modularit Tests unitaires Documentation Conclusion e

Cration dune unit pascal 1 / 4 e e


Structure dune unit (chier .pp ou .pas) e
unit nom ; interface { i n c l u s i o n d autres unit s Pascal + e types , c o n s t a n t e s et s i g n a t u r e s des sous - p r o g r a m m e s p r o p o s s par l unit ( p u b l i q u e s ) } e e imple mentati on { i n c l u s i o n d autres unit s Pascal + e types priv s , c o n s t a n t e s priv es et e e sous - p r o g r a m m e s p u b l i q u e s et priv s ) e [ initialization { Code ex cut au c h a r g e m e n t de l unit } e e e ] end .

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

4 / 31

Modularit Tests unitaires Documentation Conclusion e

Cration dune unit pascal 2 / 4 e e


Exemple
1 2 3 4 5 6 7 8 9 10 11 unit complexe ; interface type TComplexe = r e c o r d re : R e a l ; im : R e a l ; end ;

f u n c t i o n complexe ( partieReelle , p a r t i e I m a g i n a i r e : R e a l ) : TComplexe ; 12 f u n c t i o n partieReelle ( z : TComplexe ) : R e a l ; 13 f u n c t i o n p a r t i e I m a g i n a ir e ( z : TComplexe ) : R e a l ; 14 f u n c t i o n c o m p l e x e E n C h a in e ( z : TComplexe ) : String ;

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

5 / 31

Modularit Tests unitaires Documentation Conclusion e

Cration dune unit pascal 3 / 4 e e


16 imple mentati on 17 18 c o n s t N B _ C H I F F R E S _ A P R E S _ V I R G U L E = 2; 19 20 f u n c t i o n complexe ( partieReelle , p a r t i e I m a g i n a i r e : R e a l ) : TComplexe ; 21 v a r resultat : TComplexe ; 22 b e g i n 23 w i t h resultat do 24 begin 25 re := partieReelle ; 26 im := p a r t i e I m a g i n a i r e ; 27 end ; 28 complexe := resultat 29 end ; { c o m p l e x e } 30 31 f u n c t i o n partieReelle ( z : TComplexe ) : R e a l ; 32 b e g i n 33 partieReelle := z . re ; 34 end ; { p a r t i e R e e l l e }

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

6 / 31

Modularit Tests unitaires Documentation Conclusion e

Cration dune unit pascal 4 / 4 e e

36 37 38 39 40 41 42 43 44 45 46 47 48 49

f u n c t i o n p a r t i e I m a g i n a ir e ( z : TComplexe ) : R e a l ; begin pa r t i e I m a g i n a i r e := z . im ; end ; { p a r t i e I m a g i n a i r e } f u n c t i o n c o m p l e x e E n C h a in e ( z : TComplexe ) : String ; v a r re , im : String ; begin str ( partieReelle ( z ) :0: NB_CHIFFRES_APRES_VIRGULE , re ) ; str ( p a r t i e I m a g i n a i r e ( z ) :0: NB_CHIFFRES_APRES_VIRGULE , im ) ; co m p l e x e E n C h a i n e := re + + + im + i end ; { c o m p l e x e E n C h a i n e } end .

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

7 / 31

Modularit Tests unitaires Documentation Conclusion e

Utilisation dune unit pascal 1 / 4 e


On inclut une unit dans un programme (ou dans une autre unit) ` e e a laide de linstruction uses
On peut alors utiliser les types, constantes et sous-programmes proposs dans linterface de lunit e e Lorsquil y a ambigu e au niveau des identiants, on doit prxer le t e type, la constante ou le sous-programme du nom de lunit suivi dun . e

Exemple
program e xe mp le C om pl ex e ; uses Complexe ; v a r z1 : TComplexe ; begin z1 := Complexe . complexe (1 ,2) ; w r i t e l n ( c o m p l e x e E n C h a i n e ( z1 ) ) end .
Modularit etc. v1.1 e

Architecture des Systmes dInformation

as

8 / 31

Modularit Tests unitaires Documentation Conclusion e

Utilisation dune unit pascal 2 / 4 e


Remarques Une unit peut inclure une autre unit dans la partie interface ou la e e partie implementation Linclusion circulaire dunits au niveau des interfaces est e interdite
Cest possible si au moins une inclusion est au niveau de la partie implementation

Inclusion circulaire interdite


Unit UnitA ; interface Uses UnitB ; impl ementati on end . Unit UnitB interface Uses UnitA ; impl ementati on end .

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

9 / 31

Modularit Tests unitaires Documentation Conclusion e

Utilisation dune unit pascal 3 / 4 e

Inclusion circulaire autorise e


Unit UnitA ; interface Uses UnitB ; imple mentati on end . Unit UnitB interface impl ementati on Uses UnitA ; end .

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

10 / 31

Modularit Tests unitaires Documentation Conclusion e

Utilisation dune unit pascal 4 / 4 e

Compilation Pour utiliser une unit il faut quelle soit compile e e On compile une unit comme un programme Pascal (utilisation de e fpc)
Au lieu dobtenir un excutable on obtient un chier avec lextension e .ppu

Lorsque lon compile une unit ou un programme qui utilise une e unit dont la date de compilation (.ppu) est plus ancienne que la e date de modication du code source (.pas), alors cette derni`re e unit est automatiquement recompile e e

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

11 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 1 / 9
Les tests unitaires Dans le cycle en V, ` une unit de compilation doit correspondre un a e test unitaire
Certaines mthodologies de dveloppement obligent ` crire les tests e e ae unitaires avant les units de compilation. . . e

Les tests unitaires doivent tester le bon fonctionnement des fonctions, procdures et types proposs par les units de compilation e e e
Par exemple, on doit avoir :
partieReelle(complexe(a, b)) = a partieImaginaire(complexe(a, b)) = b complexeEnChaine(complexe(0, 0)) = 0 ...

Il existe des frameworks facilitant le dveloppement de tests e unitaires


JUnit (Java), CUnit (C), AUnit (Ada), PhpUnit( PHP), DUnit (Delphi), . . .
Modularit etc. v1.1 e

Architecture des Systmes dInformation

as

12 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 2 / 9

Les tests unitaires en Pascal Une unit pascal est une unit de compilation e e Il nexiste pas de framework de tests unitaires pour le freepascal non objet (sinon fpcunit) On peut tr`s bien dvelopper des tests unitaires ` la main dont e e a la structure ressemble aux tests unitaires proposs par ces e frameworks :
Dvelopper une ou plusieurs procdures (dont le nom est prx par e e e e test) de tests unitaires par fonction ou procdure ` tester e a Chaque procdure teste la fonction ou procdure et ache OK e e lorsque le test est valid, KO sinon e Le programme principal appelle toutes les procdures de test e

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

13 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 3 / 9

Tests unitaires de lunit complexe e Que faut-il vrier ? e


partieReelle(complexe(1, 2)) = 1 partieImaginaire(complexe(1, 2)) = 2 complexeEnChaine(complexe(1, 2)) = 1.00 + 2.00i (cas gnral) e e complexeEnChaine(complexe(0, 0)) = 0 complexeEnChaine(complexe(1, 0)) = 1.00 complexeEnChaine(complexe(1, 0)) = 1.00 complexeEnChaine(complexe(0, 1)) = 1.00i complexeEnChaine(complexe(0, 1)) = 1.00i

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

14 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 4 / 9
Test unitaire : testcomplexe.pp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 program testComplexe ; uses Complexe ; p r o c e d u r e test PartieRe el () ; begin w r i t e ( partieReelle : ) ; i f Complexe . partieReelle ( Complexe . complexe (1 ,2) ) =1 t h e n w r i t e l n ( OK ) else w r i t e l n ( KO ) end ; { t e s t P a r t i e R e e l } p r o c e d u r e t e s t P a r t i e I m a g i n a i r e () ; begin w r i t e ( p a r t i e Im a g i n a i r e : ) ; i f Complexe . pa r t i e I m a g i n a i r e ( Complexe . complexe (1 ,2) ) =2 t h e n w r i t e l n ( OK ) else w r i t e l n ( KO ) end ; { t e s t P a r t i e R e e l }

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

15 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 5 / 9
Test unitaire : testcomplexe.pp
23 p r o c e d u r e t e s t C o m p l e x e E n C h a i n e C a s G e n e r a l () ; 24 b e g i n 25 w r i t e ( c o m p l e x eE n C h a i n e ( cas general ) : ) ; 26 i f Complexe . co m p l e x e E n C h a i n e ( Complexe . complexe (1 ,2) ) = 1.00+2.00 i t h e n 27 w r i t e l n ( OK ) 28 else 29 w r i t e l n ( KO ) 30 end ; { t e s t C o m p l e x e E n C h a i n e C a s G e n e r a l } 31 32 p r o c e d u r e t e s t C o m p l e x e E n C h a i n e C a s Z e r o () ; 33 b e g i n 34 w r i t e ( c o m p l e x eE n C h a i n e ( cas zero ) : ) ; 35 i f Complexe . co m p l e x e E n C h a i n e ( Complexe . complexe (0 ,0) ) = 0 t h e n 36 w r i t e l n ( OK ) 37 else 38 w r i t e l n ( KO ) 39 end ; { t e s t C o m p l e x e E n C h a i n e C a s Z e r o }

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

16 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 6 / 9
Test unitaire : testcomplexe.pp
41 p r o c e d u r e t e s t C o m p l e x e E n C h a i n e C a s R e e l P o s i t i f () ; 42 b e g i n 43 w r i t e ( c o m p l e x eE n C h a i n e ( cas reel ) : ) ; 44 i f Complexe . co m p l e x e E n C h a i n e ( Complexe . complexe (1 ,0) ) = 1.00 then 45 w r i t e l n ( OK ) 46 else 47 w r i t e l n ( KO ) 48 end ; { t e s t C o m p l e x e E n C h a i n e C a s R e e l P o s i t i f } 49 50 p r o c e d u r e t e s t C o m p l e x e E n C h a i n e C a s R e e l N e g a t i f () ; 51 b e g i n 52 w r i t e ( c o m p l e x eE n C h a i n e ( cas reel negatif ) : ) ; 53 i f Complexe . co m p l e x e E n C h a i n e ( Complexe . complexe ( -1 ,0) ) = -1.00 then 54 w r i t e l n ( OK ) 55 else 56 w r i t e l n ( KO ) 57 end ; { t e s t C o m p l e x e E n C h a i n e C a s R e e l N e g a t i f }

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

17 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 7 / 9
Test unitaire : testcomplexe.pp
59 p r o c e d u r e t e s t C o m p l e x e E n C h a i n e C a s I m a g i n a i r e P o s i t i f () ; 60 b e g i n 61 w r i t e ( c o m p l e x eE n C h a i n e ( cas imaginaire positif ) : ) ; 62 i f Complexe . co m p l e x e E n C h a i n e ( Complexe . complexe (0 ,1) ) = 1.00 i then 63 w r i t e l n ( OK ) 64 else 65 w r i t e l n ( KO ) 66 end ; { t e s t C o m p l e x e E n C h a i n e C a s I m a g i n a i r e P o s i t i f } 67 68 p r o c e d u r e t e s t C o m p l e x e E n C h a i n e C a s I m a g i n a i r e N e g a t i f () ; 69 b e g i n 70 w r i t e ( c o m p l e x eE n C h a i n e ( cas imaginaire negatif ) : ) ; 71 i f Complexe . co m p l e x e E n C h a i n e ( Complexe . complexe (0 , -1) ) = -1.00 i then 72 w r i t e l n ( OK ) 73 else 74 w r i t e l n ( KO ) 75 end ; { t e s t C o m p l e x e E n C h a i n e C a s I m a g i n a i r e N e g a t i f }
Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

18 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 8 / 9

Test unitaire : testcomplexe.pp


77 b e g i n 78 w r i t e l n ( Tests unitaires de l unite complexe : ) ; 79 testP artieRe el ; 80 testPartieImaginaire ; 81 testComplexeEnChaineCasGeneral ; 82 testComplexeEnChaineCasZero ; 83 testComplexeEnChaineCasReelPositif ; 84 testComplexeEnChaineCasReelNegatif ; 85 testComplexeEnChaineCasImaginairePositif ; 86 testComplexeEnChaineCasImaginaireNegatif 87 end .

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

19 / 31

Modularit Tests unitaires Documentation Conclusion e

Tests unitaires 9 / 9
Excution du test e $ ./testComplexe Tests unitaires de lunite complexe : partieReelle : OK partieImaginaire : OK complexeEnChaine (cas general) : OK complexeEnChaine (cas zero) : KO complexeEnChaine (cas reel) : KO complexeEnChaine (cas reel negatif) : KO complexeEnChaine (cas imaginaire positif) : KO complexeEnChaine (cas imaginaire negatif) : KO Exercice Finir le dveloppement de lunit complexe pour que tous les tests e e passent as
Modularit etc. v1.1 e

Architecture des Systmes dInformation

20 / 31

Modularit Tests unitaires Documentation Conclusion e

La documentation 1 / 2
Lorsque le nombre dunits augmente et que le nombre de e sous-programme par unit est important, il est indispensale de e fournir une documentation Linsertion de la documentation dans le code permet de sassurer que cette documentation est ` jour a Des outils de documentation peuvent alors extraire certaines informations pour gnrer automatiquement la documentation e e
Ces informations doivent etre positionnes dans le commentaire du e code Ces informations doivent suivrent certaines rgles pour pouvoir tre e e interprts par loutil ee

Quelques outils :
Javadoc pour le Java Doxygen pour le C++, C, Java, Objective-C, Python, IDL, Fortran, VHDL, PHP Robotdoc pour le C, C++, Fortran, Perl, Pascal, shell scripts, as Assembler, DCL, DB/C, Tcl/Tk, Forth, Lisp, COBOL, Occam, Basic
Modularit etc. v1.1 e

Architecture des Systmes dInformation

21 / 31

Modularit Tests unitaires Documentation Conclusion e

La documentation 2 / 2
Fonctionnement

http://www.xs4all.nl/~rfsber/Robo/robodoc.html

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

22 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 1 / 8
Robodoc Logiciel Open Source, http://www.xs4all.nl/~rfsber/Robo/robodoc.html Totalement congurable (chier .rc)
A Peut gnrer du HTML, LTEX, RTF, Docbook, ASCII e e

Concepts de robodoc Une documentation est hirarchise en header et item : e e


header : caractrise un lment du code source (module, fonction, e ee type, etc.). Un header commence par **** ?* (le ? est une lettre qui caractrise lheader) et se nit par ****** e item : caractrise un header. Un item commence par un * e

Un certain nombre de header et ditem sont proposs mais on peut e en ajouter ou en supprimer
Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

23 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 2 / 8
Gnration de la documentation e e
$ robodoc --help [...] Usage: robodoc --src <directory> --doc <directory> --multidoc [type] [options] robodoc --src <directory> --doc <file> --singledoc [type] [options] robodoc --src <file> --doc <file> --singlefile [type] [options] Type: --html, --rtf, --latex, --ascii, --dbxml Options: --sections Add sections and subsections. --internal Also include internal headers. --internalonly Only include internal headers. --nosource Do not include SOURCE items. --index Add an index. --toc Add a table of contents. --folds Use fold marks. --tell ROBODoc will tell you what it is doing. --nodesc Do not descent into subdirectories. --ext EXTENSION Set extension for generated files. --cmode Use ANSI C grammar in source items (html only). --charset NAME Add character encoding information (html only). --tab NUMBER Set the tab size. --version Print version info and exit. --css Specify the stylesheet to use. --rc Specify an alternate configuration file. --lock Recognize only one header marker per file. [...]

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

24 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 3 / 8
Les header proposs par robodoc e c pour un classe d pour une constante f pour une fonction h pour un module (en Pascal une unit) e m pour une mthode e s - pour une structure (en Pascal un enregistrement) t - pour un type u pour un test unitaire v pour une variable * gnrique e e
Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

25 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 4 / 8
Les item proposs par robodoc e
NAME COPYRIGHT SYNOPSIS , USAGE FUNCTION , DESCRIPTION , PURPOSE AUTHOR CREATION DATE MODIFICATION HISTORY , HISTORY INPUTS , ARGUMENTS , OPTIONS , PARAMETERS , SWITCHES OUTPUT , SIDE EFFECTS RESULT , RETURN VALUE EXAMPLE NOTES DIAGNOSTICS
Modularit etc. v1.1 e

WARNINGS , ERRORS BUGS TODO , IDEAS PORTABILITY SEE ALSO METHODS , NEW METHODS ATTRIBUTES , NEW ATTRIBUTES TAGS DERIVED FROM DERIVED BY USES , CHILDREN USED BY , PARENTS COMMANDS SOURCE
Architecture des Systmes dInformation

as

26 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 5 / 8

Exemple : complexe.pp
1 2 3 4 5 6 7 8 9 10 11 12 13 { **** h * src / c o m p l e x e * NAME * Unit c o m p l e x e e * AUTHOR * Nicolas D e l e s t r e * C R E A T I O N DATE * 25/05/2008 * DESCRIPTION * Unit p r o p o s a n t le type T C o m p l e x e e ****** } unit complexe ; interface

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

27 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 6 / 8

15 16 17 18 19 20 21 22 23 24 25

{ **** t * c o m p l e x e / T C o m p l e x e * NAME * TComplexe * DESCRIPTION * Type p e r m e t t a n t de r e p r e s e n t e r les nombres c o m p l e x e s ****** } type TComplexe = r e c o r d re : R e a l ; im : R e a l ; end ;

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

28 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 7 / 8

27 28 29 30 31 32 33 34 35 36 37 38

{ **** f * c o m p l e x e / c o m p l e x e * NAME * complexe * FUNCTION * F o n c t i o n p e r m e t t a n t d i n t i a l i s e r un c o m p l e x e * INPUTS * * p a r t i e R e l l e ( Real ) : la valeur de la partie r elle e * * p a r t i e I m a g i n a n i r e ( Real ) : la valeur de la partie imaginanire * RESULT * un T C o m p l e x e ****** } f u n c t i o n complexe ( partieReelle , p a r t i e I m a g i n a i r e : R e a l ) : TComplexe ;

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

29 / 31

Modularit Tests unitaires Documentation Conclusion e

Robodoc 8 / 8

40 41 42 43 44 45 46 47 48 49 50 51 52

{ **** f * c o m p l e x e / p a r t i e R e e l l e * NAME * partieReelle * FUNCTION * F o n c t i o n p e r m e t t a n t d obtenir la partie r elle d un T C o m p l e x e e * INPUTS * * z ( T C o m p l e x e ) : le c o m p l e x e dont on veut obtenir la partie r elle e * RESULT * un Real * EXAMPLE * p a r t i e R e e l l e ( c o m p l e x e (1 ,2) ) r e t o u r n e r a 1 ****** } f u n c t i o n partieReelle ( z : TComplexe ) : R e a l ;

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

30 / 31

Modularit Tests unitaires Documentation Conclusion e

Conclusion

Les units Pascal permettent de faire du code rellement rutilisable e e e Les tests unitaires permettent de sassurer quune unit fonctionnne e correctement Lutilisation dun outil de gnration de documentation est e e indispensable Les environnements de dveloppement (Eclipse, NetBeans, etc.) e permettent de gnrer automatiquement des squelettes de : e e
tests unitaires commentaires avec les champs pour la documentation

Architecture des Systmes dInformation

as

Modularit etc. v1.1 e

31 / 31