AsUnitAsUnit ist ein Open Source Framework für Modultests (engl. unit test). Mithilfe von Unittests kann man automatisierte Tests in ActionScript durchführen, um Fehler in den eigenen Klassen zu erkennen und Qualitätssicherung zu betreiben.

Mit AsUnit kann z.B. eine Methode einer Klasse überprüfen werden, ob sie die gewünschten Werte zurückgibt. Dies geschieht einfach durch das Kompilieren eines Testprogramms in Flash. Somit kann man jederzeit, z.B. nach einer Änderung des Quellcodes, den Testlauf erneut starten und schauen, ob immer noch alles okay ist. Das spart Zeit (und Nerven).

Im Folgenden eine Einführung, wie AsUnit verwendet wird. Der Download des kompletten Demoprojekts befindet sich am Ende des Beitrags.

Die Klasse, die getestet werden soll

Als Beispiel dient eine einfache ActionScript-Klasse mit dem Namen Calculator. Sie hat eine Funktion addNumbers(a:Number, b:Number), die zwei Zahlen addiert und die Summe zurückgibt. Als zusätzliche Möglichkeit gibt es eine Eigenschaft offset (Defaultwert 0), die zusätzliche zur Summe hinzu addiert wird.

Actionscript:
  1. package {
  2.    
  3.     public class Calculator {
  4.             
  5.         public var offset:Number;
  6.        
  7.         public function Calculator():void {
  8.           offset = 0
  9.         }   
  10.        
  11.         public function addNumbers(a:Number, b:Number):Number {
  12.             return a + b + offset;
  13.         }   
  14.     }
  15.        
  16. }

Unittest erstellen

Als erstes muss man die Unittests erstellen. Diese werden in einer gesonderten Klasse CalculatorTest abgelegt. Sie sieht folgermaßen in diesem Beispiel aus:

Actionscript:
  1. package  {
  2.    
  3.     import asunit.framework.TestCase;
  4.        
  5.     public class CalculatorTest extends TestCase {
  6.       private var instance:Calculator;
  7.  
  8.       /**
  9.        * Constructor
  10.        */
  11.       public function CalculatorTest(testMethod:String) {
  12.       super(testMethod);
  13.      }
  14.      
  15.       /**
  16.        * Set up instance to test with
  17.        */
  18.       protected override function setUp():void {
  19.       instance = new Calculator();
  20.      }
  21.      
  22.       /**
  23.        * Delete instance used for testing
  24.        */
  25.       protected override function tearDown():void {
  26.       instance=null;
  27.      }
  28.      
  29.      
  30.      public function testAddNumbers():void {
  31.        assertTrue("Testen von addNumbers mit 10 und 5", instance.addNumbers(10,5) == 15);
  32.          instance.offset = 5;
  33.        assertTrue("Testen von addNumbers mit 10 und 5 (Offset 5)", instance.addNumbers(10,5) == 20);
  34.      }   
  35.         
  36.     }
  37. }

Interessant sind eigentlich nur die letzten Zeilen.

Die Methode testAddNumbers soll die korrekte Funktionalität der Methode addNumbers überprüfen. Die Zeile assertTrue("Test addNumbers function", instance.addNumbers(10,5) == 15) enthält zum einen Beschreibungstext des Testfalls ("Test addNumbers function"). Zum anderen wird mit instance.addNumbers(10,5) die Funktion ausgeführt und mit dem korrekten Ergebnis 15 (== 15) verglichen.

instance ist dabei ein Objekt der Klasse Calculator. Dieses kann man vor einem Test auch abändern (z.B. instance.offset = 5). Nun kann man einen erneuten Test durchführen, bei dem das Ergebnis 20 sein muss.

Unittest der Testsuite hinzufügen

Dieser einzelne Test muss nun einer Testsuite hinzugefügt werden. Die Testsuite enthält enthält alle durchzuführenden Tests. Dazu gibt es eine Klasse AllTests.as. Die Zeile addTest(new CalculatorTest("testAddNumbers")) fügt die zuvor erstellte Funktion testAddNumbers hinzu.

Actionscript:
  1. package {
  2.     import asunit.framework.TestSuite;
  3.  
  4.     public class AllTests extends TestSuite {
  5.       public function AllTests() {
  6.              super();
  7.       addTest(new CalculatorTest("testAddNumbers"));
  8.          }
  9.     }
  10. }

Test starten

Zuletzt muss man nur noch eine neue Flashdatei erstellen. Dieser weist man lediglich als Dokumentenklasse AsUnitTestRunner zu. Mehr ist nicht nötig.

Document Class

Der Inhalt der Klasse AsUnitTestRunner.as, die im gleichen Verzeichnis wie die .fla liegen muss, lautet:

Actionscript:
  1. package {
  2.     import asunit.textui.TestRunner;
  3.    
  4.     public class AsUnitTestRunner extends TestRunner {
  5.  
  6.         public function AsUnitTestRunner() {
  7.             start(AllTests, null, TestRunner.SHOW_TRACE);
  8.         }
  9.     }
  10. }

Jetzt kann man mit "Ctrl+Enter" den Test starten. Der Testlauf läuft fehlerfrei durch:

ASUnit: Erfolgreicher Test

Ändert man probehalber etwas in der Funktion, damit es nicht mehr korrekt funktioniert, schlägt der Test fehl. Anhand des Fehlertextes sieht man, wo das Problem liegt.

AsUnit: Fehlgeschlagener Test

Selbstverständich sollte nicht unerwähnt bleiben, dass Unittest natürlich nicht alle Fehler erkennen können (z.B. Fehler bei der Integration). Auf jeden Fall aber eine sinnvolle Sache.

Download: Quelldateien (.zip) (Demoprojekt)
Link: asunit.org
Link: Unit Testing with AsUnit