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".
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. |
Testebene | Synonyme Begriffe oder ähnliche Testarten | Typische Tools |
Typische Ersteller und Ausführende |
Erläuterung |
---|---|---|---|---|
Komponententest, Modultest | Unit-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, Akzeptanztest | User 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. |
Abnahmetest | Abnahme 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). |
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 |
|
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 |
|
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 |
|
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 |
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>() |
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.
Ein aktuelles Java SE JDK muss installiert sein.
Downloaden Sie Fit von http://fit.c2.com.
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
Sehen Sie sich die Fit Documentation an.
Erzeugen Sie folgende Projektverzeichnisstruktur:
[MeinWorkspace] `- [MeinFitProjekt] |- [bin] |- [FitResults] |- [FitTests] |- [lib] |- [src] | `- [meinpackage] `- [test] `- [fixtures]
Kopieren Sie in das <Projektverzeichnis>\lib-Verzeichnis die fit.jar-Library aus dem entzippten Fit-Paket.
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; } }
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 ); } }
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 | ||
startzeit | endezeit | berechneZeitdifferenz() |
0 | 0 | |
10 | 42 | 32 |
10:11 | 12:13 | 122 |
10:11:12 | 13:14:15 | 10983 |
10.11.12 | 13.14.15 | 10983 |
07:08:09 | 10:02:03 | 10434 |
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> </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>
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
Ö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 | ||
startzeit | endezeit | berechneZeitdifferenz() |
0 | null | 0 |
10 | 42 | 32 |
10:11 | 12:13 | 122 |
10:11:12 | 13:14:15 | 10983 |
10.11.12 | 13.14.15 | 10983 |
07:08:09 | 10:02:03 | 10434 |
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.
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; }
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; }
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 ); } }
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(); } }
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>
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
Ö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
Das Ergebnis enthält die eingefärbten Tabellen (grün = ok, rot = Fehler, gelb = Exception):
|
|
Ü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.
Ein aktuelles Java SE JDK muss installiert sein und Eclipse muss installiert sein (z.B. wie hier beschrieben).
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.
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.
Klicken Sie im Package Explorer mit der rechten Maustaste auf den Projektnamen 'MeinFitProProjekt' und wählen Sie 'New' | 'Folder' | 'Folder name: lib' | 'Finish'.
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.)
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'.
Sie können wahlweise die Sourcedateien als Zip-Archiv MeinFitProProjekt.zip laden, oder, wie im Folgenden beschrieben, die Dateien selbst erstellen.
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;").
Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'src' und wählen Sie 'New' | 'Package' | 'Name: meinpackage' | 'Finish'.
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.
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 ); } }
Erläuterungen zu Swing finden Sie im Swing Tutorial sowie unter Swing Text Components und TextSamplerDemo.
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.
Klicken Sie im Package Explorer mit der rechten Maustaste auf den Projektnamen 'MeinFitProProjekt' und wählen Sie 'New' | 'Source Folder' | 'Folder name: test' | 'Finish'.
Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'test' und wählen Sie 'New' | 'Package' | 'Name: jemmy' | 'Finish'.
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" } ); } }
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.
Klicken Sie im Package Explorer mit der rechten Maustaste auf den Verzeichnisnamen 'test' und wählen Sie 'New' | 'Package' | 'Name: fixtures' | 'Finish'.
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.
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'.
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> </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).
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'. |
|
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(); } }
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'.
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> </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).
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'. |
|
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(); } }
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'.
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> </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> </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).
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'. |
|
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.
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
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
Zur Einbindung von Fit in automatisierte Integrationstests mit Maven finden Sie Beispiele unter:
Zu automatisierten Integrationstests mit Selenium finden Sie Informationen unter:
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.