Wie mache ich JUnit4 – Tests mit Scalatest – update 1: Beispiel für eine Testsuite mit einem Testfall

Nach einigen Fehlversuchen habe ich den Bogen raus, wie ich JUnit4-Tests mit Scala machen kann.

Vorbereitung:

– ich brauche einen Ordner „src“ und einen Ordner „bin“. Im Ordner „src“ befinden sich weitere Unterordner, die genauso hießen und genauso geschachtelt sind wie der Pfad hinter „package“.

Beispiel: „package de.mgmechanics.myApp“ in der Klasse namens „A“ wird zum Pfad src/de/mgmechanics/myApp/A.scala

– ich habe für mich zur Regel gemacht, dass die Testfälle für eine Klasse auf derselben Ebene wie die Klasse im Unterordner „test“ liegen und Test“Klassenname“ heißen

Beispiel: die Testfälle für „package de.mgmechanics.myApp“ befinden sich in src/de/mgmechanics/myApp/test/TestsA.scala“; demzufolge steht in TestsA.scala „package de.mgmechanics.myApp.test“ (darunter steht dann „import de.mgmechanics.myApp._“ damit die zu testende Klasse gefunden wird).

– jetzt muss ich in den Ordner „src“ gehen und die Testklassen sowie die zu testenden Klassen mit „scalac -d ./bin …“ zu kompilieren

– danach habe ich im Ordner „bin“ dieselbe Struktur wie in „src“, nur dass sich anstelle der *.scala – Dateien *.class – Dateien (z.B. A.class statt A.scala) befinden

– jetzt muß ich eine *.jar-Datei erstellen: Das ist im Grunde eine zip-Datei welche (mindestens) die Ordner und Dateien unterhalb von „bin“ enthält (aber nicht „bin“ selber!). Ich füge wechsle in den Ordner „bin“ und füge den ersten Pfad mit

$ jar cf myApp.jar ./de/mgmechanics/myApp/*.class

hinzu. Dadurch entsteht eine neue Datei namens „myApp.jar“ im Ordner „bin“

– alle weiteren Pfade kommen z.B. mit

$ jar uf myApp.jar ./de/mgmechanics/myApp/test/*.class

hinzu. Weiterhin wird dieser Befehl verwendet, wenn eine Klasse neu kompiliert wurde.

– jetzt wird Scalatest mit dem Befehl – wir sind immer noch im Ordner „bin“

$ scala -cp .:$SCALATEST_HOME/scalatest-1.1.jar org.scalatest.tools.Runner -p "myApp.jar" -s de.mgmechanics.myApp.test.TestsA

(Vergleiche mit „Programming in Scala“, Seite 261)

WICHTIG: Der Teil hinter „-s“ bezeichnet die auszuführende Testklasse – und keine Datei! Also bitte keine Dateiendung wie „.class“ anhängen! ($SCALATEST_HOME enthält den Pfad zu scalatest-1.1.jar)

– nun öffnet sich ein nettes Fenster und teilt uns mit, wie der Test gelaufen ist. Wenn TestsA einen Testfall (= eine Methode, deren Name mit „test“ beginnt) enthält sollte hier nicht stehen, dass 0 Testfälle ausgeführt wurden.

F: Wie muß ein Scala-Test aussehen?

A: „FunTest“ funktioniert für mich noch nicht, weil ich diesen Code nicht mit scalac kompilieren kann. (Es wird nicht als gültiges Scala erkannt und dadurch bekomme ich keine *.class – Datei. Wie soll ich dann testen?). Daher nehme ich den JUnit4-Stil, siehe „Programming in Scala“, Seite 251. Das ist eine normale Scala-Klassen mit einem (oder mehreren) Methoden deren Namen immer mit „test“ beginnen müssen. Methoden, deren Namen nicht mit „test“ beginnen, werden nicht ausgeführt! (So kann man Hilfsmethoden schreiben.) Eine Methode = ein Testfall.

Beispiel für eine Testsuite mit einem Testfall:

package de.mgmechanics.myApp.test

import de.mgmechanics.myApp._
import org.scalatest.Suite

class myTest extends Suite {

def testA = {
val f = 49.99f //ein Float, weil am Ende ein „f“ angehangen wurde(!)
assert(f === 49.99f) //ist ok, durch „===“ (3x „=“) würden wir im Fehlerfall eine ordentliche Meldung erhalten
assert(f === 49.99) //schlägt fehl: „49.99 did not equal 49.99“ – Weil der Vergleichswert kein Float ist -> das „f“ am Ende fehlt!
expect (f) { 50f } //Noch präzisere Fehlermeldung!
}
}

Veröffentlicht in Scala, Scalatest. Kommentare deaktiviert für Wie mache ich JUnit4 – Tests mit Scalatest – update 1: Beispiel für eine Testsuite mit einem Testfall
%d Bloggern gefällt das: