Sign in Join
Wiki copytemporary

fpcunit/fr: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: fpcunit/fr

OldNewLine
1+# Vue d'ensemble
2+
3+fpcunit est un framework de test d'unité à [DUnit](https://en.wikipedia.org/wiki/DUnit)/[JUnit](https://fr.wikipedia.org/wiki/JUnit)/[SUnit](https://en.wikipedia.org/wiki/SUnit). Il vous permet d'écrire rapidement un ensemble de test pour une unité (logique) de code (pas nécessairement la même chose qu'une unité Pascal, bien que cela soit souvent le cas).
4+
5+Les méthodologies de développement comme la conception dirigée par les tests (*Test Driven Design*, *TDD*) utilise ceci pour garantir que vos attentes/spécifications dans votre unité en premier, ensuite écrivez votre code principal, puis exécutez vos tests et améliorez le code jusqu'à ce que tous les tests passent.
6+
7+Non seulement fpcunit vous permet dinspecter visuellement vos exécutions de tests, vous pouvez aussi collecter les résultats systématiquement (en utilisant la sortie XML), et l'utiliser pour comparer les versions pour p.ex. les tests de non-régression (i.e. vous exécutez vos tests de non-régression en utilisant la sortie de l'unité de test).
8+
9+Capture d'écran de l'IHM du test runner :
10+
11+![](/wiki-images/f/f8/Guitestrunner.png)
12+
13+L'image montre que sur 10 tests exécutés, 6 tests ont échoué. Les exceptions *EAssertionFailure* indiquent que les assertions de test (voir en dessous) ne sont pas satisfaites i.e. le test a échoué. Les messages associés indiquent le résultat que le test attendait et le résultat obtenu.
14+
15+# Emploi dans FPC/Lazarus
16+
17+Les tests FPCUnit sont utilisés dans le framework de test de base de données : [[Databases/fr|Databases/fr#Ex.C3.A9cution_de_tests_de_bases_de_donn.C3.A9es_de_FPC]].
18+
19+Il y a aussi des tests pour le compilateur FPC/les paquet du coeur (*core package*), mais ceux-ci sont probablement antérieurs à la fpcunit et utilisent une approche plus simple.
20+
21+# Emploi
22+
23+Il est plus simple d'utiliser Lazarus pour mettre en place un nouveau projet pour vous. En dessous, se trouvent quelques descriptions sur les procédures/méthodes à utiliser et pour quel usage.
24+
25+## Méthode Setup
26+
27+Cette méthode est présente dans tous les tests FPCUnit. Il règle l'environnement de test avant que **chaque** test s'exécute, *en d'autres termes, non seulement avant et après la suite complète des tests qui s'exécutent mais pour chaque test.*. Vous pouvez utiliser ceci pour remplir une base de données avec des données de test.
28+
29+## Méthode Teardown
30+
31+Cette procédure est présente das tous les tests FPCUnit et c'est l'inverse de la méthode Setup. Elle nettoie l'environnement de test après que chaque test se soit exécuté. Vous pouvez l'utiliser pour p.ex. effacer les données de test d'une base de données.
32+
33+## Décorateur de test : OneTimeSetup et OneTimeTearDown
34+
35+Les procédures Setup et Teardown mentionnées au dessus sont exécutées une fois par test. Vous pouvez exécuter les procédures Setup et Teardown une fois par instance/exécution de votre test.
36+
37+Pour faire ceci, utiliser OneTimeSetup et OneTimeTearDown et héritez depuis le "décorateur de test" TTestSetup et enregistrez-le, p.ex. :
38+
39+``` pascal
40+uses
41+...
42+testdecorator
43+...
44+ TDBBasicsTestSetup = class(TTestSetup)
45+ protected
46+ procedure OneTimeSetup; override;
47+ procedure OneTimeTearDown; override;
48+ end;
49+...
50+initialization
51+// make sure you register your test along with the decorator so it knows to run the setup/teardowns
52+ RegisterTestDecorator(TDBBasicsTestSetup, TTestDBBasics);
53+```
54+
55+## Tests
56+
57+Vous écrivez vos propres tests comme des procédure publiées dans la classe de test (private, protected ou public ne marcheront pas). Vous pouvez utiliser *AssertEquals* etc. pour spécifier ce qui devrait être testé et donner un message adapté quand le test échoue.
58+
59+Si vous voulez faire échouer un test, vous pouvez p.ex. utiliser :
60+
61+``` pascal
62+if 5=0 then //ridiculous example but you understand what I mean. You can use other Assert* procedures to test equality much easier etc.
63+ AssertTrue('This part of the code should never have been reached in this test.',false);
64+```
65+
66+Note : Il doit y avoir une meilleure façon de faire cela ...
67+
68+Si le test échoue, une EAssertionFailedError sera levée avec le message que vous avez spécifié dans Assert*. De cette manière, vous pouvez ajouter des sous-tests et dire lequel des sous-tests échoue. Note : le test runner s'arrêtera au premier échec d'assertion donc les sous-tests subséquent ne seront pas exécutés. Si vous voulez toujours tout exécuter, découpez ces sous-tests en procédures de test séparées.
69+
70+Au lieu des procédures Assert*, vous pouvez aussi utiliser les procédures Check* venant de DUnit (e.g. CheckEquals) qui donne des messages d'erreur plus descriptifs dans les résultats de test : ils incluent les valeurs attendues et actuelles.
71+
72+L'ordre dans lequel les tests sont exécutés est celui dans lequel ils apparaissent dans la définition de la classe de test.
73+
74+### Exemple de test
75+
76+``` pascal
77+ Ttestexport1 = class(Ttestcase)
78+...
79+ published
80+ procedure TestOutput;
81+...
82+procedure Ttestexport1.TestOutput;
83+const
84+ OutputFilename='output.csv';
85+begin
86+ TestDataSet.Close;
87+
88+ if FileExists(OutputFilename) then DeleteFile(OutputFileName);
89+ TestDataset.FileName:=OutputFileName;
90+ TestDataset.Open;
91+ // Fill test data
92+ TestDataset.Append;
93+ TestDataset.FieldByName('ID').AsInteger := 1;
94+ // Data with quotes
95+ TestDataset.FieldByName('NAME').AsString := 'J"T"';
96+ TestDataset.FieldByName('BIRTHDAY').AsDateTime := ScanDateTime('yyyymmdd', '19761231', 1);
97+ TestDataset.Post;
98+
99+ TestDataset.Last;
100+ TestDataset.First;
101+ TestDataset.First;
102+ AssertEquals('Number of records in test dataset', 1, TestDataset.RecordCount);
103+ TestDataset.Close;
104+end;
105+```
106+
107+### Hiérarchie de tests
108+
109+Dans des cas simples, vous (ou Lazarus) enregistreriez tous vos cas de test avec des appels tel que :
110+
111+``` pascal
112+uses
113+...
114+testregistry
115+...
116+initialization
117+ RegisterTest(Ttestexport1); //you pass the class name to register it for running
118+```
119+
120+However, you can also create multiple layers to group your test cases if your project gets big:
121+
122+``` pascal
123+initialization
124+ RegisterTest('WorldDominationApp.ExportCheesePlan',Ttestexport1); //The levels are separated by periods
125+ RegisterTest('WorldDominationApp.Obsolete',TtestPinkysBrain1); //another category
126+```
127+
128+# Sortie
129+
130+La test runner console peut sortir les résultat en XML (soit le format FPCUnit d'origine, ou un format plus avancé comme DUnit2 si vous utilisez l'unité *xmltestreport*), texte brut ou un format Latex (p.ex. utilisable pour des export pdf). Le test runner avec IHM sort les résultats en XML si demandé (en utilisant le même format XML *xmltestreport*).
131+
132+## Personnalisation de la sortie
133+
134+Vous pouvez exécuter votre propre "écouter" (*Listener*) pour écouter les résultats de test et sortir les données de test de la manière que vous voulez. Créez un T*Listener qui implémente l'interface ITestListener. Il y a seulement 5 méthodes à implémenter.
135+
136+Dans votre application test runner (i.e. une copie de fpctestconsole), ajoutez un objet écouteur ; enregistrez cet écouteur de test avec le framework de test (p.ex. votre test runner de console) via l'appel TestResult.AddListener() et il sera alimenté par les résultats des tests comme ils se produisent.
137+
138+### Testdbwriter
139+
140+Un exemple d'écouteur personnalisé est l'écrivain de sortie de base de données (*database output writer*) disponible à <https://bitbucket.org/reiniero/testdbwriter>. Cet écrivain sauvera tous les résultats de tests vers une base de données, qui est optimisée pour recevoir une large quantité de résultats de tests (pratique pour l'utilisation sur un serveur d'intégration continue comme Jenkins ou pour l'importation/la consolidation de resultats de tests). Le référentiel mentionné contient un exemple qui exécute les résultat des tests du framework de test de base de données vers une autre base de données.
141+
142+### A faire : adapter ceci ; utiliser la nouvelle unité xml
143+
144+Un exemple d'écouteur bonus disponible est TXMLResultsWriter dans l'unité xmlreporter dans \<fpc\>\packages\fcl-fpcunit\src\xmlreporter.pas.
145+
146+*todo: actuellement, dbtestframework semble utiliser une vieille méthode de sortie xml... Un exemple de test runner adapté qui utilise un écouteur supplémentaire peut être trouvé dans \<fpc\>\packages\fcl-db\tests\dbtestframework.pas, qui contient ce code pour sortir vers un écouteur personnalisé (un écrivain XML et un écrivain de condensé (*digest writer'') qui remplit la sortie dans une archive .tar, pratique pour traiter à distance) :
147+
148+``` pascal
149+uses
150+ ...the rest of the units needed for test runners...
151+ fpcunit,...
152+ // the units with TXMLResultsWriter and TDigestResultsWriter
153+ testreport,DigestTestReport
154+...
155+Procedure LegacyOutput;
156+
157+var
158+ FXMLResultsWriter: TXMLResultsWriter;
159+ FDigestResultsWriter: TDigestResultsWriter;
160+ testResult: TTestResult;
161+
162+begin
163+ testResult := TTestResult.Create;
164+ FXMLResultsWriter := TXMLResultsWriter.Create;
165+ FDigestResultsWriter := TDigestResultsWriter.Create(nil);
166+ try
167+ testResult.AddListener(FXMLResultsWriter);
168+ testResult.AddListener(FDigestResultsWriter);
169+ // Set some properties specific for this results writer:
170+ FDigestResultsWriter.Comment:=dbtype;
171+ FDigestResultsWriter.Category:='DB';
172+ FDigestResultsWriter.RelSrcDir:='fcl-db';
173+ //WriteHeader is specific for this listener; it writes the header to an XML file
174+ //notice that it is not called for FDigestResultsWriter
175+ FXMLResultsWriter.WriteHeader;
176+ // This performs the actual test run, and the output will be processed by the listeners:
177+ GetTestRegistry.Run(testResult);
178+ // Likewise WriteResult is specific for this listener; it writes
179+ FXMLResultsWriter.WriteResult(testResult);
180+ finally
181+ testResult.Free;
182+ FXMLResultsWriter.Free;
183+ FDigestResultsWriter.Free;
184+ end;
185+end;
186+```
187+
188+# Alternatives
189+
190+- [DUnit2](http://www.sourceforge.net/projects/dunit2/) - une énorme amélioration du DUnit initial. A l'origine écrit uniquement pour Delphi et qui est utilisé par l'énorme suite de tests d du framework [[tiOPF/fr|tiOPF]].
191+- [[FPTest/fr|FPTest]] - une branche (*fork*) de DUnit2, et qui est spécialement mise au point pour l'emploi avec le compilateur Free Pascal.
192+
193+# Lazarus
194+
195+Lazarus a des unités consoletestrunner et test runner avec IHM, qui peuvent être installée avec le paquet *FPCUnitTestRunner*. Cela vous aidera This will help you create and run your unit tests using a GUI (or console, if you want to). La consoletestrunner est compatible avec FPC donc vous n'avez pas besoin de Lazarus pour la compiler. La version Lazarus est légèremeent différente de celle de FPC (elle utilise p.ex. une sortie en UTF8 etc.).
196+
197+L'IHM runner est plus facile à utiliser. Dans celle-ci, si vous voulez exécuter tous les tests, vous devez d'abord cliquer sur un élément de test avant que le bouton *Run all tests* ne soit activé.
198+
199+# GDB bug/fonctionnalité
200+
201+**Note** (September 2012): a bug/undocumented feature in the debugger used by Lazarus/FPC (gdb) means that passing --all as run parameters has no effect. Passing this parameter can be useful when debugging console fpcunit test runners has no effect. Workaround: use -a. See bug [1](http://bugs.freepascal.org/view.php?id=22893)
202+
203+# Voir aussi
204+
205+- <https://www.freepascal.org/~michael/articles/fpcunit/fpcunit.pdf> couvre à la fois l'utilisation de FPC et Lazarus. Explique les diverses classes mises en jeu. L'intégration de portions de ce document pdf dans cette documentation (ou vice versa) pourrait être utile.
206+- <http://sergworks.wordpress.com/2012/08/31/introduction-to-unit-testing-with-lazarus/> - Un bon article sur comment faire fonctionner FPCUnit dans le confort de votre Lazarus IDE.
207+- <http://www.pp4s.co.uk/main/tu-testing-auto2.html> Programme d'exemple qui démontre le test FPCUnit
208+- ~~<http://www.win.tue.nl/~mousavi/testing/4.pdf>~~ Présentation sur FPCUnit (lien mort)
209+
210+---
211+*From the Free Pascal wiki, page "fpcunit/fr", as it stood on 2022-02-09 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history