FlexUnit
Maintenant je m'attaque à quelque chose d'essentiel, les tests unitaires. Et là encore, Adobe fournit quelque chose, ça s'appelle FlexUnit et c'est sympa :) .
C'est quoi des tests unitaires ?
Ah non, je ne vais pas expliquer ce que c'est :) . Ce billet sert juste à introduire rapidement FlexUnit pour ceux qui savent ce qu'est un test unitaire et qui découvrent Flex 2.
Pour les autres, il y a une définition sur wikipédia :) .
Installation
Après avoir téléchargé FlexUnit, il faut mettre le fichier flexunit.swc dans flex_sdk_2/frameworks/libs.
C'est tout :) .
Petit test
Tout d'abord, il faut créer une class qui fait des tests, par exemple :
package { // Import des classes nécessaires pour les tests import flexunit.framework.TestCase; import flexunit.framework.TestSuite; // Il faut toujours hériter de TestCase public class TotoTest extends TestCase { // Constructeur public function TotoTest(methodName:String) { super(methodName); } // Une méthode static qui servira à l'application FlexUnit // Ca référence les méthodes à exécuter dans cette class public static function suite():TestSuite { var ts:TestSuite = new TestSuite(); ts.addTest(new TotoTest("testTruc")); ts.addTest(new TotoTest("testTruc2")); return ts; } // Un test qui doit être vrai public function testTruc():void { assertTrue("hop", true == true); } // Un test qui doit être faux public function testTruc2():void { assertTrue("Han c'est pas bien", false); } } }
Il ne reste plus qu'à compiler le MXML :
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" xmlns:flexunit="flexunit.flexui.*" creationComplete="init()"> <mx:Script> <![CDATA[ import flexunit.framework.TestSuite; private function init():void { // Création de la suite de tests générale var ts:TestSuite = new TestSuite(); // On lance la méthode static de TotoTest qui retourne un TestSuite // Voilà, ça sert juste à ça ts.addTest(TotoTest.suite()); // On enregistre ce qu'il faut tester et hop on balance testRunner.test = ts; testRunner.startTest(); } ]]> </mx:Script> <!-- Ce qui suit est l'affichage --> <flexunit:TestRunnerBase id="testRunner" width="100%" height="100%" /> </mx:Application>
En lançant (exemple en ms-dos) :
flex_sdk_2\bin\mxmlc.exe -output mon_unittest.swf -compiler.source-path=mes_classes,dossier_des_tests mon_unittest.mxml
Et voilà ce que ça donne :

Conclusion
Très simple, regardez la documentation pour connaitre les différents Assert disponibles et les autres choses utiles.
La création de la class de test est un curieuse. Sur les autres tests unitaires que j'ai utilisé, il suffisait de référencer l'instance la class et ça prennait en compte toutes les méthodes qui commencait par test. Ici, en plus de créer chaque méthode, il faut l'ajouter dans une suite.
Avant j'utilisais AsUnit. Ils ont fait une version pour l'actionscript 3, mais ça ne marche pas du tout.
Edition du 20/11/2006
Après le commentaire de Shaoken, j'ai vu une méthode qui évite de lister chaque méthode :) .
Il est possible de passer directement en paramètre la Class qui contient les méthodes, dans un TestSuite. Seules les méthodes qui commencent par "test" seront exécutées.
Dans mon exemple, au lieu de faire :
ts.addTest(TotoTest.suite());
On peut faire :
ts.addTestSuite(TotoTest);
Commentaires
1. Le mercredi, octobre 25 2006, 12:21 par erixtekila
Ah bon ? J'ai pas eu le temps de tester.
2. Le lundi, novembre 20 2006, 00:08 par Shaoken
Yep,
Afin d'éviter de définir une instance de TestSuite avec les méthodes à tester au sein de chaque TestCase, tu peux utiliser la méthode addTestSuite (au lieu de addTest) en passant comme paramètre le nom de classe de test. La récupération des méthodes test va alors se faire via reflection (cfr TestCase::getTestMethodNames()).
Ex: ts.addTestSuite(TotoTest);
Il te faut aussi ajouter une valeur par défaut au param du constructeur du TestCase.
++ :)
3. Le lundi, novembre 20 2006, 16:23 par neolao
ah ! génial !
merci pour l'info