Akzeptanztests mit Fit

+ andere TechDocs
+ Fit
+ Selenium
+


Fit (Framework for Integrated Test) ist besonders für Akzeptanztests geignet, da die Testfälle leicht von der Fachabteilung (bzw. vom Auftraggeber) definiert werden können.

Die Testfälle werden bei Fit in HTML-Tabellen definiert und auch das Testergebnis ist eine HTML-Tabelle. Die Anbindung an das zu testende Programm erfolgt über "Fixtures".



Inhalt

  1. Testebenen
  2. Fit-Fixtures
    Basis-Fixtures ColumnFixture, RowFixture und ActionFixture, ActionFixture-Kommandos
  3. Einfaches Fit-Beispiel mit ColumnFixture
    Projekt, ZeitDiff.java, ZeitDiffFixture.java, ZeitDiffFitTest.html
  4. Verknüpfung von ColumnFixture und RowFixture
    ZeitMerker.java, ZeitMerkerColumnFixture.java, ZeitMerkerRowFixture.java, ZeitMerkerColumnAndRowFitTest.html
  5. FITpro for Eclipse für einen auf Jemmy basierenden GUI-Test mit Fit und dem ActionFixture
    FITpro for Eclipse, ZeitDiffGui.java, ZeitDiffGuiJemmyTest.java, ZeitDiffGuiColumnFixture.java, ZeitDiffGuiColumnFitTest.fit, ZeitDiffGuiActionFixture.java, ZeitDiffGuiActionFitTest.fit
  6. Automatisierte Integrationstests mit Fit, HtmlUnit, HttpUnit, Selenium und Maven
  7. Integration Test Tool ("ITT") für CSV-Input und HTML-Output



Testebenen

Leider werden einige Begriffe sehr uneinheitlich verwendet. Zumindest über die Begriffe zu den vier wichtigsten Testebenen sollte Konsens hergestellt werden. Die genannten Tools, Ersteller und Ausführenden sind nur als typische Beispiele genannt. Sie können auch für andere Testebenen relevant sein, es gibt keine genauen Abgrenzungen.

V-Modell

Testebene Synonyme Begriffe oder ähnliche Testarten Typische
Tools
Typische
Ersteller und
Ausführende
Erläuterung
Komponententest, ModultestUnit-Test,
(eventuell als Regressionstest)
JUnit, TestNG Entwickler Technisch orientierter White-Box-Test auf Klassenebene. Fremde Module werden weitgehend ignoriert.
Integrationstest(eventuell als Regressionstest) JUnit, TestNG, DbUnit, HttpUnit, HtmlUnit, Selenium Entwickler Technisch orientierter White-Box-Test, der die Zusammenarbeit (Integration) mit bestimmten fremden Modulen testet. Weniger interessante Module können durch Mocks ersetzt werden und es können abgespeckte Ersatzdatenbanken verwendet werden.
Systemtest, AkzeptanztestUser Acceptance Test (UAT),
Funktionstest
Selenium,
Fit, FitNesse
Fachabteilung,
Qualitätssicherung,
Benutzer
Fachlich orientierter Black-Box-Systemtest, wahlweise nur zu einzelnen Funktionen/Features oder zum Gesamtsystem. Möglichst inklusive der Zusammenarbeit mit anderen Systemen und ohne Mocks. Nach Möglichkeit nur über dokumentierte von außen sichtbare Schnittstellen (z.B. GUI, Webservices) und mit produktionsnahen Datenbanken.
AbnahmetestAbnahme nach Lastenheft Oft manuell Fachabteilung,
Auftraggeber
Endanwender-orientierter Black-Box-Test des fertigen vollständigen Systems entsprechend des Lastenheftes oder Pflichtenheftes für den Zeitpunkt der Endabnahme und Übergabe. Ohne Mocks und nach Möglichkeit in der Original-Produktionsumgebung (mit der Produktionsdatenbank).


Fit-Fixtures

Die drei wichtigsten Basis-Fixtures

Die Testfälle werden bei Fit in HTML-Tabellen definiert. Die Anbindung an das zu testende Programm erfolgt über Java-Klassen, die "Fixtures" genannt werden, und die bestimmte Fit-Fixture-Klassen erweitern.

Es gibt die drei Basis-Fixtures ColumnFixture, RowFixture und ActionFixture. Wenn auf Zusatzbibliotheken (z.B. FitLibrary) zurückgegriffen wird, stehen zusätzlich noch viele weitere Fixtures zur Verfügung (z.B. DoFixture).

Die folgende Tabelle beschreibt die drei Basis-Fixture-Typen:


Fit-Fixture Beispiel-Fit-Tabelle Erläuterungen
zur Fit-Tabelle
Beispiele
ColumnFixture

Testfälle mit Eingangsparametern und erwarteten Ergebniswerten
fixtures.ZeitDiffFixture
startzeitendezeitberechneZeitdifferenz()
10:1112:13122
10:11:1213:14:1510983
10.11.1213.14.1510983
07:08:0910:02:0310434
1. Zeile:
Fixture-Klasse (inkl. Package),
2. Zeile:
Eingangsparameter und erwartete Ergebniswerte,
3. und weitere Zeilen:
Testfälle
Fit-Tabelle:
ZeitDiffFitTest.html
ZeitMerkerColumnAndRowFitTest.html
ZeitDiffGuiColumnFitTest.fit
Fixture-Klasse:
ZeitDiffFixture.java
ZeitMerkerColumnFixture.java
ZeitDiffGuiColumnFixture.java
RowFixture

Liste von Abfrageergebnisobjekten oder Records
fixtures.ZeitMerkerRowFixture
namestundenminutensekunden
Karl333
Gustav333
Otto25354
1. Zeile:
Fixture-Klasse (inkl. Package),
2. Zeile:
Attributnamen,
3. und weitere Zeilen:
Attributwerte
Fit-Tabelle:
ZeitMerkerColumnAndRowFitTest.html
Fixture-Klasse:
ZeitMerkerRowFixture.java
ActionFixture

Sequentielle Abfolgen in GUI-Tests und Workflows
fit.ActionFixture
startfixtures.ZeitActionFixture 
entersetStartZeit10:11:12
entersetEndeZeit13:14:15
presspushButton 
checkgetAusgabe10983
1. Zeile:
fit.ActionFixture (oder fit.TimedActionFixture)
2. und weitere Zeilen:
1. Spalte: Action-Kommando (s.u.)
2. Spalte: Fixture-Methode
3. Spalte: Eventuell Parameter
Fit-Tabelle:
ZeitDiffGuiActionFitTest.fit
Fixture-Klasse:
ZeitDiffGuiActionFixture.java

Die vier ActionFixture-Kommandos

1. Spalte:
Action-
Kommando
2. Spalte:
Fixture-Methode
3. Spalte:
Eventuell Parameter
Aufgerufene Methode
start Fixture, welches instanziiert wird. Die ab diesem Aufruf folgenden Kommandos (bis zum nächsten 'start') beziehen sich auf diese Fixture-Instanz.   - Konstruktor der von ActionFixture abgeleiteten Klasse
enter Name des Input-Elements Einzugebende Daten public void <nameDesInputElements>( <type> param )
press Name des Buttons   - public void <nameDesButtons>()
check Name des abzufragenden Elements Erwarteter Wert public <type> <nameDesAbzufragendenElements>()


Einfaches Fit-Beispiel mit ColumnFixture

  1. Das folgende Beispiel wird ohne komfortable IDE beschrieben, weil so am einfachsten das Prinzip und die Vorgänge verstanden werden können. Weiter unten folgt ein Beispiel, wie es mit Eclipse geht.

  2. Ein aktuelles Java SE JDK muss installiert sein.

  3. Downloaden Sie Fit von http://fit.c2.com.

  4. Entzippen Sie die downgeloadete Datei (z.B. fit-java-1.1.zip), lesen Sie die readme.html-Datei und führen Sie das darin genannte arithmetic-Beispiel aus mit der Kommandozeile:

    java -cp fit.jar fit.FileRunner examples/input/arithmetic.html results.html

  5. Sehen Sie sich die Fit Documentation an.

  6. Erzeugen Sie folgende Projektverzeichnisstruktur:

    [MeinWorkspace]
     `- [MeinFitProjekt]
         |- [bin]
         |- [FitResults]
         |- [FitTests]
         |- [lib]
         |- [src]
         |   `- [meinpackage]
         `- [test]
             `- [fixtures]
    
  7. Kopieren Sie in das <Projektverzeichnis>\lib-Verzeichnis die fit.jar-Library aus dem entzippten Fit-Paket.

  8. Das zu testende Programm ("System under Test", "SUT") soll ein kleines Programm zur Berechnung der Differenz in Sekunden zweier Uhrzeitangaben im Format "HH:mm:ss" (z.B. "13:47:42") sein.

    Speichern Sie im Verzeichnis <Projektverzeichnis>\src\meinpackage die folgende Java-Klasse ZeitDiff.java:

    package meinpackage;
    
    public class ZeitDiff
    {
       public static void main( String[] args )
       {
          System.out.println( "Bitte zwei Uhrzeiten im HH:mm:ss-Format angeben." );
          System.out.println( calculateTimeDiff( args[0], args[1] ) );
       }
    
       // Berechne Zeitdifferenz in Sekunden zweier Uhrzeiten im HH:mm:ss-Format
       public static int calculateTimeDiff( String startTime, String endTime )
       {
          String[] startArr = ((startTime != null ) ? startTime : "").split( ":|\\." );
          String[] endArr   = ((endTime   != null ) ? endTime   : "").split( ":|\\." );
          int startSecs=0, endSecs=0;
          for( int i=0; i<startArr.length; i++ ) {
             startSecs = startSecs * 60 +
                ((startArr[i] != null && startArr[i].trim().length() > 0)
                 ? Integer.parseInt( startArr[i] ) : 0);
          }
          for( int i=0; i<endArr.length; i++ ) {
             endSecs = endSecs * 60 +
                ((endArr[i] != null && endArr[i].trim().length() > 0)
                 ? Integer.parseInt( endArr[i] ) : 0);
          }
          return endSecs - startSecs;
       }
    }
    
  9. Die drei wichtigsten Fit-Fixture-Typen sind "ColumnFixture" (Testfälle mit Eingangsparametern und erwartete zu berechnende Werte), "RowFixture" (Liste von Abfrageergebnisobjekten oder Records) und "ActionFixture" (sequentielle Abfolgen in GUI-Tests und Workflows). Das erstere wird im Folgenden implementiert.

    Speichern Sie im Verzeichnis <Projektverzeichnis>\test\fixtures die folgende von ColumnFixture abgeleitete Java-Klasse ZeitDiffFixture.java:

    package fixtures;
    
    public class ZeitDiffFixture extends fit.ColumnFixture
    {
       public String startzeit;
       public String endezeit;
    
       public int berechneZeitdifferenz()
       {
          return meinpackage.ZeitDiff.calculateTimeDiff( startzeit, endezeit );
       }
    }
    
  10. Die Fit-Testbeschreibung erfolgt als HTML-Tabelle (erste Zeile: Fixture-Angabe, zweite Zeile: Eingabeparameter und erwartete zu berechnende Ausgabewerte, weitere Zeilen: Testfälle):

    fixtures.ZeitDiffFixture
    startzeitendezeitberechneZeitdifferenz()
    0 0
    104232
    10:1112:13122
    10:11:1213:14:1510983
    10.11.1213.14.1510983
    07:08:0910:02:0310434

    Speichern Sie im Verzeichnis <Projektverzeichnis>\FitTests die folgende HTML-Datei ZeitDiffFitTest.html (Sie können die HTML-Datei alternativ auch mit Word oder Excel erstellen und/oder bearbeiten oder mit FitNesse auch als Wiki-Seite):

    <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       <title>ZeitDiff-FitTest</title>
    </head>
    <body>
    
    <h2>ZeitDiff-FitTest</h2>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="3">fixtures.ZeitDiffFixture</td></tr>
       <tr><td>startzeit</td><td>endezeit</td><td>berechneZeitdifferenz()</td></tr>
       <tr><td>0</td><td>&nbsp;</td><td>0</td></tr>
       <tr><td>10</td><td>42</td><td>32</td></tr>
       <tr><td>10:11</td><td>12:13</td><td>122</td></tr>
       <tr><td>10:11:12</td><td>13:14:15</td><td>10983</td></tr>
       <tr><td>10.11.12</td><td>13.14.15</td><td>10983</td></tr>
       <tr><td>07:08:09</td><td>10:02:03</td><td>10434</td></tr>
    </table>
    
    <br>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="2">fit.Summary</td></tr>
    </table>
    
    </body>
    </html>
    
  11. Ihr Projektverzeichnis sieht jetzt so aus (überprüfen Sie es mit "tree /F"):

    [MeinWorkspace]
     `- [MeinFitProjekt]
         |- [bin]
         |- [FitResults]
         |- [FitTests]
         |   `- ZeitDiffFitTest.html
         |- [lib]
         |   `- fit.jar
         |- [src]
         |   `- [meinpackage]
         |       `- ZeitDiff.java
         `- [test]
             `- [fixtures]
                 `- ZeitDiffFixture.java
    
  12. Öffnen Sie ein Kommandozeilenfenster ('Windows-Taste' + 'R', 'cmd') und führen Sie folgende Kommandos aus:

    cd \MeinWorkspace\MeinFitProjekt

    tree /F

    javac -d bin -cp bin src\meinpackage\ZeitDiff.java

    javac -d bin -cp bin;lib/fit.jar test\fixtures\ZeitDiffFixture.java

    java -cp bin;lib/fit.jar fit.FileRunner FitTests/ZeitDiffFitTest.html FitResults/ZeitDiffFitTest-Result.html

    start FitResults/ZeitDiffFitTest-Result.html

    Das Ergebnis enthält die eingefärbte Tabelle (grün = ok, rot = Fehler, gelb = Exception):

    fixtures.ZeitDiffFixture
    startzeitendezeitberechneZeitdifferenz()
    0 null0
    104232
    10:1112:13122
    10:11:1213:14:1510983
    10.11.1213.14.1510983
    07:08:0910:02:0310434


Verknüpfung von ColumnFixture und RowFixture

  1. Das oben vorgestellte Beispiel soll etwas erweitert werden, um das Fit-RowFixture vorstellen zu können.

    Sie können wahlweise die Sourcedateien als Zip-Archiv MeinFitProjekt.zip laden, oder, wie im Folgenden beschrieben, die Dateien selbst erstellen.

  2. Speichern Sie im Verzeichnis <Projektverzeichnis>\src\meinpackage die folgende Datenklasse ZeitMerkerErgebnis.java:

    package meinpackage;
    
    public class ZeitMerkerErgebnis
    {
       public String name;
       public int stunden;
       public int minuten;
       public int sekunden;
    }
    
  3. Speichern Sie im Verzeichnis <Projektverzeichnis>\src\meinpackage die folgende die Programmlogik beinhaltende Klasse ZeitMerker.java ("System under Test", "SUT"):

    package meinpackage;
    
    import java.util.*;
    
    @SuppressWarnings("unchecked")
    public class ZeitMerker
    {
       private List zeitMerkerListe = new ArrayList();
    
       public int speichere( String name, String startzeit, String endezeit )
       {
          ZeitMerkerDaten zm = new ZeitMerkerDaten();
          zm.name = name;
          zm.startzeit = startzeit;
          zm.endezeit = endezeit;
          zeitMerkerListe.add( zm );
          return zeitMerkerListe.size();
       }
    
       public ZeitMerkerErgebnis[] leseAlle()
       {
          List zeitErgebnisListe = new ArrayList();
          Iterator itr = zeitMerkerListe.iterator();
          while( itr.hasNext() ) {
             ZeitMerkerErgebnis ze = new ZeitMerkerErgebnis();
             ZeitMerkerDaten    zm = (ZeitMerkerDaten) itr.next();
             int diffSek = meinpackage.ZeitDiff.calculateTimeDiff( zm.startzeit, zm.endezeit );
             ze.name     = zm.name;
             ze.stunden  = diffSek / 3600;
             ze.minuten  = (diffSek - 3600 * ze.stunden) / 60;
             ze.sekunden = diffSek - 3600 * ze.stunden - 60 * ze.minuten;
             zeitErgebnisListe.add( ze );
          }
          return (ZeitMerkerErgebnis[]) zeitErgebnisListe.toArray(
                new ZeitMerkerErgebnis[zeitErgebnisListe.size()] );
       }
    }
    
    class ZeitMerkerDaten
    {
       public String name;
       public String startzeit;
       public String endezeit;
    }
    
  4. Speichern Sie im Verzeichnis <Projektverzeichnis>\test\fixtures die folgende von ColumnFixture abgeleitete Java-Klasse ZeitMerkerColumnFixture.java:

    package fixtures;
    
    import meinpackage.ZeitMerker;
    
    public class ZeitMerkerColumnFixture extends fit.ColumnFixture
    {
       protected static ZeitMerker zeitMerker = new ZeitMerker();
       public String name;
       public String startzeit;
       public String endezeit;
    
       public int speichere()
       {
          return zeitMerker.speichere( name, startzeit, endezeit );
       }
    }
    
  5. Speichern Sie im Verzeichnis <Projektverzeichnis>\test\fixtures die folgende von RowFixture abgeleitete Java-Klasse ZeitMerkerRowFixture.java:

    package fixtures;
    
    public class ZeitMerkerRowFixture extends fit.RowFixture
    {
       @SuppressWarnings("unchecked")
       @Override
       public Class getTargetClass()
       {
          return meinpackage.ZeitMerkerErgebnis.class;
       }
    
       @Override
       public Object[] query() throws Exception
       {
          return ZeitMerkerColumnFixture.zeitMerker.leseAlle();
       }
    }
    
  6. Speichern Sie im Verzeichnis <Projektverzeichnis>\FitTests die folgende Fit-Test-HTML-Datei ZeitMerkerColumnAndRowFitTest.html:

    <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       <title>ZeitMerker-ColumnAndRow-FitTest</title>
    </head>
    <body>
    
    <h2>ZeitMerker-ColumnAndRow-FitTest</h2>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="4">fixtures.ZeitMerkerColumnFixture</td></tr>
       <tr><td>name</td><td>startzeit</td><td>endezeit</td><td>speichere()</td></tr>
       <tr><td>Karl</td><td>10:11:12</td><td>13:14:15</td><td>1</td></tr>
       <tr><td>Gustav</td><td>10.11.12</td><td>13.14.15</td><td>2</td></tr>
       <tr><td>Otto</td><td>07:08:09</td><td>10:02:03</td><td>3</td></tr>
    </table>
    
    <br>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="4">fixtures.ZeitMerkerRowFixture</td></tr>
       <tr><td>name</td><td>stunden</td><td>minuten</td><td>sekunden</td></tr>
       <tr><td>Karl</td><td>3</td><td>3</td><td>3</td></tr>
       <tr><td>Gustav</td><td>3</td><td>3</td><td>3</td></tr>
       <tr><td>Otto</td><td>2</td><td>53</td><td>54</td></tr>
    </table>
    
    </body>
    </html>
    
  7. Ihr Projektverzeichnis sieht jetzt so aus (überprüfen Sie es mit "tree /F"):

    [MeinWorkspace]
     `- [MeinFitProjekt]
         |- [bin]
         |   `- ...
         |- [FitResults]
         |   `- ...
         |- [FitTests]
         |   |- ZeitDiffFitTest.html
         |   `- ZeitMerkerColumnAndRowFitTest.html
         |- [lib]
         |   `- fit.jar
         |- [src]
         |   `- [meinpackage]
         |       |- ZeitDiff.java
         |       |- ZeitMerker.java
         |       `- ZeitMerkerErgebnis.java
         `- [test]
             `- [fixtures]
                 |- ZeitDiffFixture.java
                 |- ZeitMerkerColumnFixture.java
                 `- ZeitMerkerRowFixture.java
    
  8. Öffnen Sie ein Kommandozeilenfenster ('Windows-Taste' + 'R', 'cmd') und führen Sie folgende Kommandos aus:

    cd \MeinWorkspace\MeinFitProjekt

    tree /F

    javac -d bin -cp bin src\meinpackage\*.java

    javac -d bin -cp bin;lib/fit.jar test\fixtures\ZeitMerker*.java

    java -cp bin;lib/fit.jar fit.FileRunner FitTests/ZeitMerkerColumnAndRowFitTest.html FitResults/ZeitMerkerColumnAndRowFitTest-Result.html

    start FitResults/ZeitMerkerColumnAndRowFitTest-Result.html

  9. Das Ergebnis enthält die eingefärbten Tabellen (grün = ok, rot = Fehler, gelb = Exception):

    fixtures.ZeitMerkerColumnFixture
    namestartzeitendezeitspeichere()
    Karl10:11:1213:14:151
    Gustav10.11.1213.14.152
    Otto07:08:0910:02:033
      
    fixtures.ZeitMerkerRowFixture
    namestundenminutensekunden
    Karl333
    Gustav333
    Otto25354

    Über die erste Tabelle (ColumnFixture) werden einzelne Datensätze gespeichert. Über die zweite Tabelle (RowFixture) wird die Liste aller umgeformten Datensätze gelesen und geprüft.
    Der zweite Fit-Test übernimmt also Daten aus dem ersten Fit-Test, was im Beispiel über das "static ZeitMerker zeitMerker"-Objekt realisiert wird.



FITpro for Eclipse für einen auf Jemmy basierenden GUI-Test mit Fit und dem ActionFixture

FITpro for Eclipse installieren

  1. Ein aktuelles Java SE JDK muss installiert sein und Eclipse muss installiert sein (z.B. wie hier beschrieben).

  2. Um das Eclipse-Plug-in FITpro for Eclipse in Eclipse zu installieren, wählen Sie in Eclipse zuerst:
    'Help' | 'Install new Software...' | 'Available Software Sites' | 'Add...' | 'Name: FITpro for Eclipse' und 'Location: http://fitpro.sourceforge.net/EclipseUpdate/' | 'OK' | Checkbox vor 'FITpro for Eclipse' aktivieren | 'OK'
    und dann:
    'Help' | 'Install new Software...' | 'Work with: FITpro for Eclipse - http://fitpro.sourceforge.net/EclipseUpdate/' | Checkbox vor 'FITpro for Eclipse' aktivieren | 'Next' | 'Finish'.

    Alternativ können Sie die FITpro-for-Eclipse-.zip-Datei downloaden und im Eclipse-plugins-Verzeichnis entpacken.

Projektstart und Libraries

  1. Starten Sie in Eclipse ein FITpro-Projekt über: 'File' | 'New' | 'Project...' | 'Fit' | 'Java Project with FITpro'.
    Tragen Sie im "Create a Java Project with FITpro"-Dialog ein: 'Project name: MeinFitProProjekt' und 'Fixtures: fixtures' (mit kleinem 'f'). Die Einträge 'Fit Results: FitResults' und 'Fit Tests: FitTests' lassen Sie so.

  2. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Projektnamen 'MeinFitProProjekt' und wählen Sie 'New' | 'Folder' | 'Folder name: lib' | 'Finish'.

  3. Einige der folgenden Beispiele verwenden für GUI-Tests Jemmy zur Anbindung an Swing: Downloaden Sie Jemmy von http://jemmy.java.net und kopieren Sie 'jemmy.jar' in das neu erstellte lib-Verzeichnis.
    (Falls der Jemmy-Download nicht funktioniert: Suchen Sie z.B. mit Google nach jemmy.jar oder jemmy-2.3.jar.)

  4. Klicken Sie in Eclipse im Package Explorer mit der linken Maustaste auf den Projektnamen 'MeinFitProProjekt' und betätigen Sie 'F5', damit Eclipse die kopierte .jar-Library findet. Öffnen Sie in Eclipse im Package Explorer das lib-Verzeichnis, markieren Sie die .jar-Library, klicken Sie mit der rechten Maustaste darauf und wählen Sie: 'Build Path' | 'Add to Build Path'.

Mini-Swing-Programm erstellen

  1. Sie können wahlweise die Sourcedateien als Zip-Archiv MeinFitProProjekt.zip laden, oder, wie im Folgenden beschrieben, die Dateien selbst erstellen.

  2. Falls beim Anlegen des FITpro-Projekts Beispiel-Fixtures erzeugt wurden und diese in Eclipse Fehler wegen fehlender Package-Anweisung melden, können Sie entweder diese Beispiel-Fixtures löschen oder eine Package-Anweisung hinzufügen ("package fixtures;").

  3. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'src' und wählen Sie 'New' | 'Package' | 'Name: meinpackage' | 'Finish'.

  4. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Packagenamen 'meinpackage' und wählen Sie 'New' | 'Class' | 'Name: ZeitDiff' | 'Finish'.
    Im sich öffnenden Editor-Fenster zur ZeitDiff.java-Klasse löschen Sie den Inhalt und fügen den oben unter ZeitDiff.java gezeigten Inhalt ein.

  5. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Packagenamen 'meinpackage' und wählen Sie 'New' | 'Class' | 'Name: ZeitDiffGui' | 'Finish'.
    Im sich öffnenden Editor-Fenster zur ZeitDiffGui.java-Klasse löschen Sie den Inhalt und fügen folgende Swing-Klasse ein:

    package meinpackage;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ZeitDiffGui
    {
       public static final String FRAME_TITLE = "ZeitDiff";
    
       public static void main( String[] args )
       {
          starteMeinSwingProgramm();
       }
    
       public static void starteMeinSwingProgramm()
       {
          JPanel panel1 = new JPanel();
          panel1.setBorder( BorderFactory.createEmptyBorder( 16, 16, 4, 16 ) );
          panel1.setLayout( new GridLayout( 1, 1 ) );
          panel1.add( new JLabel( "Bitte Start- und Endzeit eingeben und den Button betätigen" ) );
    
          final JTextField startZeit = new JTextField();
          final JTextField endeZeit  = new JTextField();
          final JTextField ausgabe   = new JTextField();
          JButton butt = new JButton( "Zeitdifferenz berechnen" );
          butt.addActionListener( new ActionListener() {
             @Override
             public void actionPerformed( ActionEvent ev ) {
                ausgabe.setText( meineMethode( startZeit.getText(), endeZeit.getText() ) );
             }
          } );
    
          JPanel panel2 = new JPanel();
          panel2.setBorder( BorderFactory.createEmptyBorder( 4, 16, 16, 16 ) );
          panel2.setLayout( new GridLayout( 3, 2, 16, 16 ) );
          panel2.add( new JLabel( "Startzeit (HH:mm:ss)" ) );
          panel2.add( startZeit );
          panel2.add( new JLabel( "Endzeit (HH:mm:ss)" ) );
          panel2.add( endeZeit );
          panel2.add( butt );
          panel2.add( ausgabe );
    
          JFrame frame = new JFrame( FRAME_TITLE );
          frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
          frame.setResizable( false );
          frame.setLocation( 100, 100 );
          frame.setLayout( new BorderLayout( 16, 16 ) );
          frame.add( panel1, BorderLayout.PAGE_START );
          frame.add( panel2, BorderLayout.CENTER );
          frame.pack();
          frame.setVisible( true );
       }
    
       public static String meineMethode( String startZeit, String endeZeit )
       {
          return "" + ZeitDiff.calculateTimeDiff( startZeit, endeZeit );
       }
    }
    
    ZeitDiffSwingGui

    Erläuterungen zu Swing finden Sie im Swing Tutorial sowie unter Swing Text Components und TextSamplerDemo.

  6. Setzen Sie den Cursor in das ZeitDiffGui.java-Editorfenster und betätigen Sie 'Alt + Shift + X' und 'J' (oder wählen Sie 'Run' | 'Run As' | 'Java Application').
    Geben Sie in die beiden Eingabefelder Uhrzeiten ein (z.B. 10:11:12 und 13:14:15) und betätigen Sie die Schaltfläche, um die Zeitdifferenz zu berechnen.

GUI-Test mit Jemmy (vorerst ohne Fit)

  1. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Projektnamen 'MeinFitProProjekt' und wählen Sie 'New' | 'Source Folder' | 'Folder name: test' | 'Finish'.

  2. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'test' und wählen Sie 'New' | 'Package' | 'Name: jemmy' | 'Finish'.

  3. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Packagenamen 'jemmy' und wählen Sie 'New' | 'Class' | 'Name: ZeitDiffGuiJemmyTest' | 'Finish'.
    Im sich öffnenden Editor-Fenster zur ZeitDiffGuiJemmyTest.java-Klasse löschen Sie den Inhalt und fügen Folgendes ein:

    package jemmy;
    
    import org.netbeans.jemmy.*;
    import org.netbeans.jemmy.operators.*;
    
    public class ZeitDiffGuiJemmyTest implements Scenario
    {
       JFrameOperator     frame;
       JTextFieldOperator startZeit;
       JTextFieldOperator endeZeit;
       JButtonOperator    butt;
       JTextFieldOperator ausgabe;
    
       public ZeitDiffGuiJemmyTest() throws Exception
       {
          (new ClassReference( "meinpackage.ZeitDiffGui" )).startApplication();
    
          frame     = new JFrameOperator( meinpackage.ZeitDiffGui.FRAME_TITLE );
          startZeit = new JTextFieldOperator( frame, 0 );
          endeZeit  = new JTextFieldOperator( frame, 1 );
          butt      = new JButtonOperator( frame );
          ausgabe   = new JTextFieldOperator( frame, 2 );
       }
    
       public void setStartZeit( String s ) { startZeit.setText( s ); }
    
       public void setEndeZeit( String s ) { endeZeit.setText( s ); }
    
       public void pushButton() { butt.push(); }
    
       public String getAusgabe() { return ausgabe.getText(); }
    
       @Override
       public int runIt( Object param )
       {
          String[] parms;
          if( param != null && param instanceof String[] && ((String[]) param).length >= 3 ) {
             parms = (String[]) param;
          } else {
             parms = new String[] { "10:11:12", "13:14:15", "10983" };
          }
          try {
             setStartZeit( parms[0] );
             setEndeZeit(  parms[1] );
             String rslt = parms[2];
             pushButton();
             parms[2] = getAusgabe();
             return (rslt == null || rslt.trim().length() == 0 || rslt.equals(getAusgabe())) ? 0 : 1;
          } catch( Exception ex ) {
             ex.printStackTrace();
             return 1;
          }
       }
    
       public static void main( String[] args )
       {
          Test.main( new String[] { "jemmy.ZeitDiffGuiJemmyTest" } );
       }
    }
    
  4. Setzen Sie den Cursor in das ZeitDiffGuiJemmyTest.java-Editorfenster und betätigen Sie 'Alt + Shift + X' und 'J' (oder wählen Sie 'Run' | 'Run As' | 'Java Application').
    Sie sehen kurz das GUI-Programm aufblitzen und im Eclipse-Consolenfenster erscheinen viele Trace-Ausgaben, die am Ende folgende Textfragmente enthalten:

    org.netbeans.jemmy.TestCompletedException: Test passed

    "Test jemmy.ZeitDiffGuiJemmyTest finished" action has been produced in 33 milliseconds with result
      : 0

    Wichtig ist die "0" am Ende, da sie für Fehlerfreiheit steht.

Test des Kommandozeilenprogramms mit Fit

  1. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'test' und wählen Sie 'New' | 'Package' | 'Name: fixtures' | 'Finish'.

  2. Klicken Sie im Package Explorer unter dem Verzeichnisnamen 'test' mit der rechten Maustaste auf den Packagenamen 'fixtures' und wählen Sie 'New' | 'Class' | 'Name: ZeitDiffFixture' | 'Finish'.
    Im sich öffnenden Editor-Fenster zur ZeitDiffFixture.java-Klasse löschen Sie den Inhalt und fügen den oben unter ZeitDiffFixture.java gezeigten Inhalt ein.

  3. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'FitTests' und wählen Sie 'New' | 'Other...' | 'Fit File' | 'Next' | 'File name: ZeitDiffFitTest.fit' | 'Finish'.

  4. Suchen Sie das FitTest-'Source'-Fenster:
    Falls Ihr 'ZeitDiffFitTest.fit'-Fenster unten einen Tabulatorreiter 'Source' zeigt: Wählen Sie diesen.
    Falls Ihr 'ZeitDiffFitTest.fit'-Fenster zweigeteilt ist: Normalerweise ist das untere Fenster das 'Source'-Fenster.
    Das 'Source'-Fenster zeigt "<html></html>" an. Ersetzen Sie dies durch folgenden Inhalt:

    <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       <title>ZeitDiff-FitTest</title>
    </head>
    <body>
    
    <h2>ZeitDiff-FitTest</h2>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="3">fixtures.ZeitDiffFixture</td></tr>
       <tr><td>startzeit</td><td>endezeit</td><td>berechneZeitdifferenz()</td></tr>
       <tr><td>0</td><td>&nbsp;</td><td>0</td></tr>
       <tr><td>10</td><td>42</td><td>32</td></tr>
       <tr><td>10:11</td><td>12:13</td><td>122</td></tr>
       <tr><td>10:11:12</td><td>13:14:15</td><td>10983</td></tr>
       <tr><td>10.11.12</td><td>13.14.15</td><td>10983</td></tr>
       <tr><td>07:08:09</td><td>10:02:03</td><td>10434</td></tr>
    </table>
    
    </body>
    </html>
    

    Speichern Sie mit 'Strg + S' (eventuell geht das nicht im 'Source'-Fenster, sondern nur im 'Design'-Fenster).

  5. Klicken Sie im Package Explorer unter dem Verzeichnis 'FitTests' mit der rechten Maustaste auf 'ZeitDiffFitTest.fit' und wählen Sie 'Run As' | 'Fit test'. Um das Ergebnis anzuzeigen klicken Sie entweder im Consolen-Ausgabefenster auf den Link 'ZeitDiffFitTest.fit-...html' oder klicken Sie im Package Explorer zuerst mit der linken Maustaste auf das Verzeichnis 'FitResults' und betätigen 'F5' und klicken dann im Verzeichnis 'FitResults' mit der rechten Maustaste auf die aktuellste Datei 'ZeitDiffFitTest.fit-...html' und wählen 'Open With' | 'Web Browser'.

       
    fixtures.ZeitDiffFixture
    startzeitendezeitberechneZeitdifferenz()
    0 null0
    104232
    10:1112:13122
    10:11:1213:14:1510983
    10.11.1213.14.1510983
    07:08:0910:02:0310434

Test des GUI-Programms mit Fit und mit dem ColumnFixture

  1. Klicken Sie im Package Explorer unter dem Verzeichnisnamen 'test' mit der rechten Maustaste auf den Packagenamen 'fixtures' und wählen Sie 'New' | 'Class' | 'Name: ZeitDiffGuiColumnFixture' | 'Finish'.
    Im sich öffnenden Editor-Fenster zur ZeitDiffGuiColumnFixture.java-Klasse löschen Sie den Inhalt und fügen Folgendes ein:

    package fixtures;
    
    public class ZeitDiffGuiColumnFixture extends fit.ColumnFixture
    {
       public String startzeit;
       public String endezeit;
    
       public String berechneZeitdifferenz() throws Exception
       {
          jemmy.ZeitDiffGuiJemmyTest zdgjt = new jemmy.ZeitDiffGuiJemmyTest();
    
          zdgjt.setStartZeit( startzeit );
          zdgjt.setEndeZeit(  endezeit  );
          zdgjt.pushButton();
    
          return zdgjt.getAusgabe();
       }
    }
    
  2. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'FitTests' und wählen Sie 'New' | 'Other...' | 'Fit File' | 'Next' | 'File name: ZeitDiffGuiColumnFitTest.fit' | 'Finish'.

  3. Suchen Sie das FitTest-'Source'-Fenster:
    Falls Ihr 'ZeitDiffGuiColumnFitTest.fit'-Fenster unten einen Tabulatorreiter 'Source' zeigt: Wählen Sie diesen.
    Falls Ihr 'ZeitDiffGuiColumnFitTest.fit'-Fenster zweigeteilt ist: Normalerweise ist das untere Fenster das 'Source'-Fenster.
    Das 'Source'-Fenster zeigt "<html></html>" an. Ersetzen Sie dies durch folgenden Inhalt:

    <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       <title>ZeitDiff-Gui-Column-FitTest</title>
    </head>
    <body>
    
    <h2>ZeitDiff-Gui-Column-FitTest</h2>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="3">fixtures.ZeitDiffGuiColumnFixture</td></tr>
       <tr><td>startzeit</td><td>endezeit</td><td>berechneZeitdifferenz()</td></tr>
       <tr><td>0</td><td>&nbsp;</td><td>0</td></tr>
       <tr><td>10</td><td>42</td><td>32</td></tr>
       <tr><td>10:11</td><td>12:13</td><td>122</td></tr>
       <tr><td>10:11:12</td><td>13:14:15</td><td>10983</td></tr>
       <tr><td>10.11.12</td><td>13.14.15</td><td>10983</td></tr>
       <tr><td>07:08:09</td><td>10:02:03</td><td>10434</td></tr>
    </table>
    
    </body>
    </html>
    

    Speichern Sie mit 'Strg + S' (eventuell geht das nicht im 'Source'-Fenster, sondern nur im 'Design'-Fenster).

  4. Klicken Sie im Package Explorer unter dem Verzeichnis 'FitTests' mit der rechten Maustaste auf 'ZeitDiffGuiColumnFitTest.fit' und wählen Sie 'Run As' | 'Fit test'. Um das Ergebnis anzuzeigen klicken Sie entweder im Consolen-Ausgabefenster auf den Link 'ZeitDiffGuiColumnFitTest.fit-...html' oder klicken Sie im Package Explorer zuerst mit der linken Maustaste auf das Verzeichnis 'FitResults' und betätigen 'F5' und klicken dann im Verzeichnis 'FitResults' mit der rechten Maustaste auf die aktuellste Datei 'ZeitDiffGuiColumnFitTest.fit-...html' und wählen 'Open With' | 'Web Browser'.

       
    fixtures.ZeitDiffGuiColumnFixture
    startzeitendezeitberechneZeitdifferenz()
    0 null0
    104232
    10:1112:13122
    10:11:1213:14:1510983
    10.11.1213.14.1510983
    07:08:0910:02:0310434

Test des GUI-Programms mit Fit und mit dem ActionFixture

  1. Klicken Sie im Package Explorer unter dem Verzeichnisnamen 'test' mit der rechten Maustaste auf den Packagenamen 'fixtures' und wählen Sie 'New' | 'Class' | 'Name: ZeitDiffGuiActionFixture' | 'Finish'.
    Im sich öffnenden Editor-Fenster zur ZeitDiffGuiActionFixture.java-Klasse löschen Sie den Inhalt und fügen Folgendes ein:

    package fixtures;
    
    public class ZeitDiffGuiActionFixture extends fit.ActionFixture
    {
       jemmy.ZeitDiffGuiJemmyTest zdgjt;
    
       public ZeitDiffGuiActionFixture() throws Exception
       {
          zdgjt = new jemmy.ZeitDiffGuiJemmyTest();
       }
    
       public void setStartZeit( String startzeit )
       {
          zdgjt.setStartZeit( startzeit );
       }
    
       public void setEndeZeit( String endezeit )
       {
          zdgjt.setEndeZeit( endezeit );
       }
    
       public void pushButton()
       {
          zdgjt.pushButton();
       }
    
       public String getAusgabe()
       {
          return zdgjt.getAusgabe();
       }
    }
    
  2. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'FitTests' und wählen Sie 'New' | 'Other...' | 'Fit File' | 'Next' | 'File name: ZeitDiffGuiActionFitTest.fit' | 'Finish'.

  3. Suchen Sie das FitTest-'Source'-Fenster:
    Falls Ihr 'ZeitDiffGuiActionFitTest.fit'-Fenster unten einen Tabulatorreiter 'Source' zeigt: Wählen Sie diesen.
    Falls Ihr 'ZeitDiffGuiActionFitTest.fit'-Fenster zweigeteilt ist: Normalerweise ist das untere Fenster das 'Source'-Fenster.
    Das 'Source'-Fenster zeigt "<html></html>" an. Ersetzen Sie dies durch folgenden Inhalt:

    <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
       <title>ZeitDiff-Gui-Action-FitTest</title>
    </head>
    <body>
    
    <h2>ZeitDiff-Gui-Action-FitTest</h2>
    
    <table border="1" cellspacing="0" cellpadding="3">
       <tr><td colspan="3">fit.ActionFixture</td></tr>
       <tr><td>start</td><td>fixtures.ZeitDiffGuiActionFixture</td><td>&nbsp;</td></tr>
       <tr><td>enter</td><td>setStartZeit</td><td>10:11:12</td></tr>
       <tr><td>enter</td><td>setEndeZeit</td><td>13:14:15</td></tr>
       <tr><td>press</td><td>pushButton</td><td>&nbsp;</td></tr>
       <tr><td>check</td><td>getAusgabe</td><td>10983</td></tr>
    </table>
    
    </body>
    </html>
    

    Speichern Sie mit 'Strg + S' (eventuell geht das nicht im 'Source'-Fenster, sondern nur im 'Design'-Fenster).

  4. Klicken Sie im Package Explorer unter dem Verzeichnis 'FitTests' mit der rechten Maustaste auf 'ZeitDiffGuiActionFitTest.fit' und wählen Sie 'Run As' | 'Fit test'. Um das Ergebnis anzuzeigen klicken Sie entweder im Consolen-Ausgabefenster auf den Link 'ZeitDiffGuiActionFitTest.fit-...html' oder klicken Sie im Package Explorer zuerst mit der linken Maustaste auf das Verzeichnis 'FitResults' und betätigen 'F5' und klicken dann im Verzeichnis 'FitResults' mit der rechten Maustaste auf die aktuellste Datei 'ZeitDiffGuiActionFitTest.fit-...html' und wählen 'Open With' | 'Web Browser'.

       
    fit.ActionFixture
    startfixtures.ZeitDiffGuiActionFixture 
    entersetStartZeit10:11:12
    entersetEndeZeit13:14:15
    presspushButton 
    checkgetAusgabe10983
  5. Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'FitTests' und wählen Sie 'New' | 'Other...' | 'Fit Suite' | 'Next' | 'File name: FitTests.suite', 'Suite name: FitTests-Suite', 'Description: Meine FitTests-Suite' | 'Finish'. Fügen Sie über 'Add...' die drei FitTests 'ZeitDiffFitTest.fit', 'ZeitDiffGuiColumnFitTest.fit' und 'ZeitDiffGuiActionFitTest.fit' aus dem 'FitTests'-Verzeichnis hinzu. Es entsteht folgende 'FitTests.suite'-Datei:

    <fitsuite name="FitTests-Suite" desc="Meine FitTests-Suite">
        <testref>ZeitDiffFitTest.fit</testref>
        <testref>ZeitDiffGuiColumnFitTest.fit</testref>
        <testref>ZeitDiffGuiActionFitTest.fit</testref>
    </fitsuite>
    

    Klicken Sie im Package Explorer mit der rechten Maustaste im Verzeichnis 'FitTests' auf 'FitTests.suite' und wählen Sie 'Run As' | 'Fit test'. Alle eingetragenen FitTests werden ausgeführt. Sehen Sie sich das Ergebnis in FitResults/FitTests.suite-...html an.

  6. Falls Sie auch die fitlibraryRunner.jar-Lib in das lib-Verzeichnis verschoben haben, sieht Ihr Projektverzeichnis jetzt so aus (überprüfen Sie es mit "tree /F"):

    [MeinWorkspace]
     `- [MeinFitProProjekt]
         |- [bin]
         |   `- ...
         |- [FitResults]
         |   `- ...
         |- [FitTests]
         |   |- FitTests.suite
         |   |- ZeitDiffFitTest.fit
         |   |- ZeitDiffGuiActionFitTest.fit
         |   `- ZeitDiffGuiColumnFitTest.fit
         |- [lib]
         |   |- fitlibraryRunner.jar
         |   `- jemmy.jar
         |- [src]
         |   `- [meinpackage]
         |       |- ZeitDiff.java
         |       `- ZeitDiffGui.java
         |- [test]
         |   |- [fixtures]
         |   |   |- ZeitDiffFixture.java
         |   |   |- ZeitDiffGuiActionFixture.java
         |   |   `- ZeitDiffGuiColumnFixture.java
         |   `- [jemmy]
         |       `- ZeitDiffGuiJemmyTest.java
         |- .classpath
         `- .project
    
  7. Falls Sie das Beispiel nicht mit Eclipse sondern per Kommandozeile ausführen wollen (z.B. in einer automatisierten Testumgebung): Öffnen Sie ein Kommandozeilenfenster ('Windows-Taste' + 'R', 'cmd') und führen Sie folgende Kommandos aus (im lib-Verzeichnis muss sich fit.jar oder fitlibraryRunner.jar befinden):

    Kompilation:

    cd \MeinWorkspace\MeinFitProProjekt

    tree /F

    javac -d bin -cp bin src\meinpackage\*.java

    javac -d bin -cp bin;lib/jemmy.jar test\jemmy\*.java

    javac -d bin -cp bin;lib/* test\fixtures\*.java

    Aufruf des GUI-Programms (Mini-Swing-Programm):

    java -cp bin meinpackage.ZeitDiffGui

    GUI-Test mit Jemmy (vorerst ohne Fit):

    java -cp bin;lib/jemmy.jar jemmy.ZeitDiffGuiJemmyTest

    Test des Kommandozeilenprogramms mit Fit:

    java -cp bin;lib/* fit.FileRunner FitTests/ZeitDiffFitTest.fit FitResults/ZeitDiffFitTest-Result.html

    start FitResults/ZeitDiffFitTest-Result.html

    Test des GUI-Programms mit Fit und mit dem ColumnFixture:

    java -cp bin;lib/* fit.FileRunner FitTests/ZeitDiffGuiColumnFitTest.fit FitResults/ZeitDiffGuiColumnFitTest-Result.html

    start FitResults/ZeitDiffGuiColumnFitTest-Result.html

    Test des GUI-Programms mit Fit und mit dem ActionFixture:

    java -cp bin;lib/* fit.FileRunner FitTests/ZeitDiffGuiActionFitTest.fit FitResults/ZeitDiffGuiActionFitTest-Result.html

    start FitResults/ZeitDiffGuiActionFitTest-Result.html



Automatisierte Integrationstests mit Fit, HtmlUnit, HttpUnit, Selenium und Maven

Zur Einbindung von Fit in automatisierte Integrationstests mit Maven finden Sie Beispiele unter:

Zu automatisierten Integrationstests mit Selenium finden Sie Informationen unter:



Integration Test Tool ("ITT") für CSV-Input und HTML-Output

Falls Sie ein sehr einfaches Tool suchen, welches die Testparameter nicht per HTML-, sondern per CSV-Datei entgegennimmt, aber das Ergebnis trotzdem im HTML-Format liefert, können Sie sich den Sourcecode des Integration Test Tool ("ITT") für CSV-Input und HTML-Output downloaden.





Weitere Themen: andere TechDocs | Selenium
© 2008 Torsten Horn, Aachen