2010-03-18 7 views
12

Ich programmiere meist in Scala und Java, mit Scalatest in Scala und Junit für Unit-Tests. Ich möchte die gleichen Tests auf mehrere Implementierungen derselben Schnittstelle/Eigenschaft anwenden. Die Idee besteht darin, zu überprüfen, ob der Schnittstellenvertrag durchgesetzt wird, und das Likov-Substitutionsprinzip zu überprüfen.Unit testing mehrere Implementierung der gleichen Eigenschaft/Schnittstelle

Wenn beispielsweise Implementierungen von Listen zu testen, könnten Tests umfassen:

  • Eine Instanz sollte leer sein, wenn und nur wenn und nur wenn sie die Größe Null hat.
  • Nach dem Aufruf von clear sollte die Größe Null sein.
  • Durch Hinzufügen eines Elements in der Mitte einer Liste wird der Index der rhs-Elemente um eins erhöht.
  • usw.

Was sind die besten Praktiken?

Antwort

6

Das klingt, als könnte es ein Job für gemeinsame Tests sein. Geteilte Tests sind Tests, die von verschiedenen Fixture-Objekten gemeinsam genutzt werden. Das heißt, derselbe Testcode wird auf verschiedenen Daten ausgeführt. ScalaTest unterstützt dies. Suchen Sie nach "shared tests" in der Dokumentation Ihres bevorzugten Stilmerkmals, das Tests als Funktionen darstellt (Spec, WordSpec, FunSuite, FlatSpec usw.). Ein Beispiel ist die Syntax für FlatSpec:

it should behave like emptyList

Siehe Sharing Tests in der FlatSpec Dokumentation

4

Contract Tests sind einfach zu machen mit JUnit 4, here ist ein Video von Ben Rady.

+0

Großartig! Funktioniert diese Technik auch mit Scalatest? – paradigmatic

+0

Sorry, keine Ahnung :) – abyx

+0

Ich habe gerade versucht mit Scalatest und es scheint zu funktionieren. Vielen Dank. – paradigmatic

8

In Java/JUnit handhabe ich dies in der Regel mit einem abstrakten Testfall, von dem Tests für die spezifische Testklasse alle Tests erben und eine Setup-Methode, die die Implementierung instanziiert. Ich kann das Video, das jetzt geposted wird, nicht sehen, aber ich vermute, dass es diese allgemeine Idee ist.

Eine weitere interessante Möglichkeit, wenn es Ihnen nichts ausmacht, ein weiteres Testframework einzuführen, wäre die Verwendung von JDave Spezifikationsklassen.

Ich habe nicht versucht, beide mit Scalatest oder mit Scala Eigenschaften und Implementierungen zu verwenden, aber es sollte möglich sein, etwas ähnliches zu tun.

0

Für Scala, stark Scalacheck in Betracht ziehen. Alle diese Verträge sind in ScalaCheck als einzeilige Spezifikationen ausdrückbar. Beim Ausführen erzeugt ScalaCheck eine konfigurierbare Anzahl von Stichprobeneingaben nach dem Zufallsprinzip und überprüft, ob alle Spezifikationen erfüllt sind. Es ist die semantisch dichte Möglichkeit, Unit-Tests zu erstellen.