fh-hof tools richard göbel. fh-hof tools für die veranstaltung junit: testen ant: build-tool...
TRANSCRIPT
FH-Hof
Tools
Richard Göbel
FH-Hof
Tools für die Veranstaltung
JUnit: Testen
ANT: Build-Tool
Eclipse: Entwicklungsumgebung
FH-Hof
JUnit
JUnit unterstützt automatisierte Softwaretests
Junit ermöglicht
Blackbox Tests
Whitebox Tests auf Methodenebene
Junit instrumentiert nicht den Programmcode,
um den Abdeckungsgrad eines Tests
festzustellen
Zwei neue Themen:
Annotations
Import statischer Funktionen und Variablen
FH-Hof
Annotation
Einfügen von Zusatzinformationen in Quellcode
(seit Version 1.5)
Annotationen:
beginnen mit dem Zeichen @ . . .
. . . werden von dem Compiler nicht
übersetzt . . .
. . . geben aber Zusatzinformation für Tools
während Übersetzung, "Deployment" oder zur
Laufzeit
FH-Hof
Compileranweisung @SuppressWarnings
public class TestKlasse
{
@SuppressWarnings("unchecked")
LinkedList genList (int n)
{
LinkedList list = new LinkedList();
for (int i = 0; i < n; i++) list.add("");
return list;
}
}
FH-Hof
Compileranweisung @Override
public class MyWindowListener extends
WindowAdapter
{
@Override
// windowClosing waere richtig
public void windoclosing(WindowEvent e)
{
System.exit(0);
}
}
FH-Hof
Compileranweisung @Deprecated
public class TestKlasse
{
@Deprecated
void veryOldFunction ()
{
. . .
}
}
FH-Hof
Definition einer eigenen Annotation
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface MethodenAnnotation
{
String erzeugtVon();
int version() default 1;
String[] geaendertVon();
}
FH-Hof
Anwendung der Annotation
@MethodenAnnotation (
erzeugtVon="Hans",
version=1,
geaendertVon= { "Elke" , "Joe" , "Mary" })
void someFunction ()
{
. . .
}
FH-Hof
Abfrage der Annotation zur Laufzeit
Class cl = Class.forName("TestKlasse");
Method me =
cl.getDeclaredMethod("someFunction");
Class an = Class.forName("MethodenAnnotation");
MethodenAnnotation
ma = (MethodenAnnotation)
me.getAnnotation(an);
System.out.println(ma.erzeugtVon());
FH-Hof
Import für JUnit
Import von Klassen des Package "junit":
import org.junit.*;
Import statischer Elemente der Klassen
"Assert" und "JUnitCore"
import static org.junit.Assert.*;
import static org.junit.runner.JUnitCore.*;
FH-Hof
Einsatz vonJUnit
JUnit
Open Source Software
IBM's Common Public License Version 0.5
verfügbar durch SourceForge: http://junit,org
Anwendung
Realisierung eines beliebigen Java-Programms
(wie bisher)
JAR-Datei in den Classpath eintragen (z.B. junit-
4.4.jar)
Implementierung zusätzlicher Testklassen
Start der Tests
java org.junit.runner.JUnitCore TestClass1, …
FH-Hof
Beispiele für eine zu testende Klasse
class Coordinate {
int x = 0, y = 0;
void setX(int x) {this.x = x;}
void setY(int y) {this.y = y;}
int getX(int x) {return x;}
int getY(int y) {return y;}
}
FH-Hof
Beispiel für eine Testklasse I
class TestCoordinate {
Coordinate c;
@BeforeClass
public static void setUpBeforeClass() throws {
c = new Coordinate();
}
@Before
public void setUp() throws Exception {
c.x = 0;
c.y = 0;
}
. . .
FH-Hof
Beispiel für eine Testklasse II
. . .
@Test
public void checkX() throws Exception {
c.setX(3);
assertEquals("Error X", 3, c.getX());
assertEquals("Side effect Y", 0, c.getY());
}
@Test
public void checkY() throws Exception {
c.setY(5);
assertEquals("Error Y", 5, c.getY());
assertEquals("Side effect X", 0, c.getX());
}}
FH-Hof
Annotationen für JUnit
After
AfterClass
Before
BeforeClass
Ignore
Test
FH-Hof
Assertions
assertEquals
assertArrayEquals
assertNull, assertNotNull
assertFalse, assertTrue
assertSame, assertNotSame
assertThat
fail
FH-Hof
Assumptions
static void
assumeNoException(java.lang.Throwable t)
static void assumeNotNull(java.lang.Object...
objects)
static <T> void assumeThat(T value,
org.hamcrest.Matcher<T> assumption)
static void assumeTrue(boolean b)
FH-Hof
ANT
"Build Tool" zur Erzeugung von
Programmsystemen
Akronym ANT
"Ameise"
"Another Neat Tool"
Home
http://jakarta.apache.org
Werkzeug für Java auf Java basierend
FH-Hof
Beispiel für Aktionen von Ant
Kompilieren
Testen
JAR-Dateien erzeugen
Javadoc generieren
FH-Hof
Installation
Umgebungsvariablen
set ANT_HOME= . . .
set JAVA_HOME= . . .
set PATH= . . .;%ANT_HOME%\bin;
Anweisungen für ANT über XML-Datei: build.xml
FH-Hof
Beispiel für eine Build-Datei – Basis
<project name="PrimeProject"
default="execute"
basedir=".">
<target name="execute" depends="translate">
<java classname="Prime"/>
</target>
<target name="translate">
<javac srcdir="." includes="Prime.java"/>
</target>
</project>
FH-Hof
Beispiel für eine Build-Datei – Jar-Datei
<target name="pack" depends="translate">
<jar destfile="Prime.jar" basedir="."
includes="Prime.class">
<manifest>
<attribute name="Built-By"
value="richard"/>
<attribute name="Main-Class"
value="Prime"/>
</manifest>
</jar>
</target>
FH-Hof
Beispiel für eine Build-Datei – JUnit-Test
<target name="jtest" depends="translate">
<junit fork="no">
<formatter type="xml" extension=".xml"/>
<test name="TestPrime"/>
</junit>
</target>
FH-Hof
Beispiele Aufrufe von ANT
ant
ant translate
ant execute
ant jtest
ant pack
FH-Hof
Basis
project
Attribut name: Bezeichnung
Attribut default: Default-Target
Attribut basedir: Basisverzeichnis
target : Menge von Aufgaben (Tasks)
Attribut name: Bezeichnung
Attribut depends: Abhängigkeiten
Attribut description: Kurzbeschreibung
task: zu erledigende Aufgaben für ein Target
FH-Hof
Beispiele für Tasks
ant
concat
copy
jar
java
javac
delete
move
rmic
sql
tstamp
FH-Hof
Properties
Eine Property hat einen Namen und einen Wert
Zugriff auf den Wert einer Property innerhalb
eines Attributwerts über ${ . . . }
Beispiele für eingebaute Properties
basedir : absolute Pfad des "basedir"
ant.file: absolute Pfad der Build-Datei
ant.version: Version von Ant
ant.project.name: aktueller Projektname
ant.java.version: aktuelle Java-Version
FH-Hof
Build-Datei mit Properties I
<project name="PrimeProject" default="pack" basedir=".">
<property name="source" location="src"/>
<property name="class" location="class"/>
<target name="init">
<tstamp/>
<mkdir dir="${class}"/>
</target>
<target name="translate" depends="init">
<javac srcdir="${source}" destdir="${class}"/>
</target>
. . .
FH-Hof
Build-Datei mit Properties II
. . .
<target name="pack" depends="translate">
<jar destfile="Prime${DSTAMP}.jar" basedir="${class}">
<manifest>
<attribute name="Built-By" value="richard"/>
<attribute name="Main-Class" value="Prime"/>
</manifest>
</jar>
</target>
<target name="clean">
<delete dir="${class}"/>
</target>
</project>
FH-Hof
Bedingte Erzeugung von Targets
<target name="jtest" depends="translate">
<junit fork="no" errorproperty="testfail">
. . . .
</junit>
</target>
<target name="pack" depends="translate,jtest" unless="testfail">
<jar destfile="Prime${DSTAMP}.jar" basedir="${class}">
<manifest>
. . .
</manifest>
</jar>
</target>
FH-Hof
Hierarchisches Erzeugen von Systemen
Die einzelnen Build-Dateien folgen der
Package-Struktur
Beispiel
packages a, b, a.c, a.d, a.c.e
Build-Dateien für a, b, a.c, a.d, a.c.e
Aufruf untergeordneter Build-Dateien aus der
Build-Datei des jeweils übergeordneten
Package
FH-Hof
Task Ant
antfile: Build-Datei (Default build.xml)
dir: Basisverzeichnis
target: welches Target soll erzeugt werden
output: Dateiname für Ausgabe dieses
Kommandos
inheritAll: Weitergabe aller Properties (Default:
true)
inheritRefs: Weitergabe aller Referenzen
(Default: false)