Beide sind BDD-fähige Unit-Test-Frameworks (Behavior Driven Development) für Scala, die in Scala geschrieben wurden. Und Specs, auf denen aufgebaut ist, können auch das ScalaTest- Framework umfassen. Aber was bietet Specs ScalaTest nicht? Was sind die Unterschiede?
121
Antworten:
Specs und ScalaTest sind beide gute Tools für zufriedene Benutzer, unterscheiden sich jedoch in mehrfacher Hinsicht. Sie werden wahrscheinlich eines als Haupttestwerkzeug in Scala auswählen wollen, müssen aber das andere nicht aufgeben, da Sie Teile von beiden verwenden können. Wenn Sie ScalaTest mögen
FeatureSpec
Syntax von und die Mockito-Syntax von , können Sie beide JAR-Dateien in Ihren Klassenpfad einfügen und beide gleichzeitig verwenden. Hier werde ich versuchen, die wichtigsten Unterschiede in der Designphilosophie zu erfassen, die ich zwischen den Spezifikationen und ScalaTest festgestellt habe.Wahrscheinlich besteht der wichtigste philosophische Unterschied zwischen den Tools darin, dass Spezifikationen für die verhaltensgesteuerte Entwicklung (BDD) entwickelt wurden, während ScalaTest allgemeiner ist. ScalaTest bietet Eigenschaften, die Sie mischen können, um das Verhalten zu erhalten, das Sie in Ihren Testklassen bevorzugen, einschließlich BDD. Sie können auch einfach Ihr eigenes Verhalten definieren, wenn Sie etwas anderes möchten.
ScalaTest unterstützt BDD durch seine
Spec
,FeatureSpec
,WordSpec
,FlatSpec
, undGivenWhenThen
Züge, und hat auch Eigenschaften , die Sie mischen in kann eine schöne Matcher Syntax zu erhalten. Wenn Sie "sollte" mögen, mischen Sie ShouldMatchers ein. Wenn Sie "muss" mögen, mischen Sie einMustMatchers
. Wenn Sie BDD mögen, aber keine Matcher-Syntax mögen, können Sie einfach eines der ScalaTest-Spec-Merkmale verwenden, ohne ein Matcher-Merkmal einzumischen. Specs hat eine Specification-Klasse, die Sie erweitern, und Sie müssen das Wort "must" in Ihren Matcher-Ausdrücken verwenden. Ein großer philosophischer Unterschied, der hier offensichtlich ist, ist, dass ScalaTest Ihnen viel mehr Auswahlmöglichkeiten bietet. Um die Navigation in diesem Bereich Ihrer Wahl zu vereinfachen, stelle ich hier einen Entscheidungsbaum bereit:http://www.scalatest.org/quick_start
Die Matcher-Syntax unterscheidet sich auch zwischen ScalaTest und Spezifikationen. In ScalaTest habe ich versucht zu sehen, wie weit ich mit der Operator-Notation gehen kann, und am Ende habe ich Matcher-Ausdrücke gefunden, die sich sehr ähnlich wie englische Sätze mit Leerzeichen zwischen den Wörtern lesen. Die Syntax des Specs Matchers führt Wörter mehr zusammen mit der Groß- und Kleinschreibung des Kamels aus.
Specs hat mehr Matcher als ScalaTest und das spiegelt meiner Meinung nach einen Unterschied in der Designeinstellung wider. Ich habe wahrscheinlich 2/3 der Matcher-Syntax geschnitten, die ich erstellt und für die Veröffentlichung in Betracht gezogen habe. Ich werde in zukünftigen Versionen weitere Matcher hinzufügen, wollte aber sichergehen, dass ich wusste, dass Benutzer tatsächlich etwas wollten, bevor ich es hinzufügte. Die Matcher von ScalaTest enthalten jedoch eine dynamische Eigenschafts-Matcher-Syntax, die einen Teil dieser Lücke einnimmt. Zum Beispiel können Sie in Specs schreiben auf
java.io.File
:Dadurch wird das aufgerufen
isDirectory
und sichergestellt, dass es wahr ist. ScalaTest hatjava.io.Files
derzeit keine speziellen Matcher , aber in ScalaTest können Sie einfach eine dynamische Prüfung wie die folgende verwenden:Jedes Mal, wenn Sie ein Symbol nachher übergeben
be
, wird mithilfe der Reflexion (in diesem Fall) nach einer Methode oder einem Feld mit dem Namendirectory
oder einer Methode mit dem Namen gesuchtisDirectory
. Es gibt auch eine Möglichkeit, dies statisch zu machen, indem Sie a definierenBePropertyMatcher
(was normalerweise nur 2 oder 3 Codezeilen erfordert). Grundsätzlich versuche ich in ScalaTest, mehr Funktionalität mit weniger API bereitzustellen.Ein weiterer allgemeiner Unterschied in der Designeinstellung zwischen Spezifikationen und ScalaTest betrifft implizite Konvertierungen. Standardmäßig erhalten Sie bei Verwendung von ScalaTest nur eine implizite Konvertierung, bei der der
===
Operator auf alles angewendet wird . (Wenn nötig, können Sie diese implizite Konvertierung mit einer Codezeile "deaktivieren". Der einzige Grund, warum Sie dies tun müssten, wäre, wenn Sie versuchen würden, etwas zu testen, das einen eigenen===
Operator hat, und Sie einen Konflikt erhalten. ) ScalaTest definiert viele andere implizite Konvertierungen. Um sie jedoch zu verwenden, müssen Sie sie explizit in Ihren Code "einladen", indem Sie ein Merkmal einmischen oder einen Import durchführen. Wenn Sie die Klasse erweiternSpecification
Ich denke, Sie erhalten standardmäßig Dutzende impliziter Konvertierungen. Ich bin mir nicht sicher, wie wichtig dies in der Praxis sein wird, aber ich denke, die Leute werden Code testen wollen, der ihre eigenen Implikationen verwendet, und manchmal kann es einen Konflikt zwischen den Implikationen des Testframeworks und denen des Produktionscodes geben. In diesem Fall ist es möglicherweise einfacher, das Problem in ScalaTest zu umgehen als die Spezifikationen.Ein weiterer Unterschied in der Designeinstellung, den ich bemerkt habe, ist der Komfort bei den Bedienern. Ein Ziel, das ich hatte, war, dass jeder Programmierer, der sich den Testcode eines anderen ansieht, der ScalaTest verwendet, die Bedeutung erraten kann, ohne etwas in der ScalaTest-Dokumentation nachzuschlagen. Ich wollte, dass der ScalaTest-Clientcode absolut offensichtlich ist. Ein Weg, wie sich dieses Ziel manifestierte, ist, dass ScalaTest den Betreibern gegenüber sehr konservativ ist. Ich definiere nur fünf Operatoren in ScalaTest:
===
, was bedeutet gleich>
, was bedeutet größer als<
, weniger als>=
, größer als oder gleich<=
, weniger als oder gleich.Das ist es. Diese Dinge sehen also so ziemlich so aus, wie sie bedeuten. Wenn Sie im Code eines anderen sehen:
Ich hoffe, dass Sie nicht zur API-Dokumentation gehen müssen, um zu erraten, was das
<=
bedeutet. Im Gegensatz dazu sind die technischen Daten bei den Betreibern viel freier. Daran ist nichts auszusetzen, aber es ist ein Unterschied. Die Betreiber können Code prägnanter machen, aber der Kompromiss ist , dass Sie in der Dokumentation laufen müssen, wenn Sie Dinge wie finden->-
,>>
,|
,|>
,!
, oder^^^
(die alle eine besondere Bedeutung in Specs haben) in Testcode Ihres Kollegen.Ein anderer philosophischer Unterschied ist , dass ich versuche und mache es einfach etwas leichter in ScalaTest einen funktionalen Stil zu verwenden , wenn Sie benötigen eine Befestigung zu teilen, während Specs standardmäßig die Tradition der weiter
setUp
undtearDown
nähert von JUnit populär, in dem Sie Umhang Vars vor jedem Test. Wenn Sie jedoch auf diese Weise testen möchten, ist dies auch in ScalaTest sehr einfach. Sie müssen nur dasBeforeAndAfter
Merkmal einmischen.Weitere Informationen zu ScalaTest finden Sie in der Präsentation "Get Higher with ScalaTest", die ich auf der Devoxx-Konferenz 2009 hier gehalten habe:
http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about
quelle
Die Hauptunterschiede sind (meistens aus Sicht der technischen Daten :-)):
ScalaTest bietet mehr "Teststile" als Spezifikationen (Sie können jeden Aufzählungspunkt auf der Schnellstartseite besuchen , um eine detaillierte Ansicht zu jedem Stil zu erhalten).
ScalaTest und Spezifikationen haben unterschiedliche Matcher. Sie können sie hier für ScalaTest und hier für Spezifikationen vergleichen. Auf dieser Seite haben die Spezifikationen viele kleine Funktionen, die Ihnen beim Schreiben Ihrer Spezifikation gefallen könnten: XML-Matcher, Matcher-Zusammensetzung (eine einfache Möglichkeit, Matcher durch Transformation wiederzuverwenden), präzise Fehler, detaillierte Unterschiede für lange Zeichenfolgen usw. .
Mockito hat eine nette BDD-Unterstützung in den Spezifikationen erhalten: Mockito
specs verfügt über DataTables, mit denen viele kleine Beispiele in einer Art Tabelle zusammengefasst werden können (wenn Sie Operatoren als Tabellenbegrenzer verwenden können).
In Spezifikationen können Sie Beispiele definieren, die als libidum verschachtelt und auf jeder Ebene automatisch bereinigt werden
Dies ist sicherlich ein sehr partieller und voreingenommener Vergleich, und es gibt viele andere Unterschiede (und die Bibliotheken entwickeln sich weiter, ...).
Letztendlich denke ich, dass es wirklich von Ihrem Test- / Spezifikationsstil abhängt. Wenn es einfach ist (einfache Spezifikationsstruktur, Setups, Erwartungen, ...), werden beide Bibliotheken sehr ähnlich aussehen. Ansonsten haben beide ihre Meinung dazu, wie die Dinge zu tun sind. Als letztes Beispiel können Sie sich das Tagging ansehen: in ScalaTest und in den Spezifikationen .
Ich hoffe das hilft.
quelle
Soweit ich weiß, kommt es, abgesehen von einigen hochspezialisierten Funktionen, auf die persönlichen Vorlieben an, die dem Stil entsprechen.
quelle
Die IDE-Unterstützung kann ein weiterer Punkt sein
Ich habe versucht, Specs über JUnit dazu zu bringen, mit Eclipse zu arbeiten, und ich fand die offizielle Lösung etwas "hacky". Spezifikationssetup: http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse
Die Integration von ScalaTest (auch über JUnit) mit scheint etwas weniger hackig zu sein. Trotzdem habe ich keine, die so gut funktioniert wie JUnit und Java.
ScalaTest-Setup: http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse
quelle
Wenn ein Entscheidungsfaktor die Kompilierungszeit ist, scheint Scalatest eine bessere Leistung zu erzielen.
Wir verwenden derzeit specs2 in unserem Projekt, leiden jedoch unter langsamen Kompilierungszeiten in Tests. Ich habe gerade einen POC für die Umstellung auf Scalatest abgeschlossen und festgestellt, dass die Kompilierungszeiten um den Faktor 0,82 gesunken sind, indem ich die beiden Frameworks in einigen unserer Quellen gewechselt habe.
quelle