Frage

Sowohl

ist BDD (Behavior Driven Development), die Unit-Test-Frameworks für Scala in Scala geschrieben. Und Specs baut auf kann auch die ScalaTest Rahmen. Aber was bedeutet Specs bieten ScalaTest nicht? Was sind die Unterschiede?

War es hilfreich?

Lösung

Specs und ScalaTest sind beide gute Werkzeuge mit glücklichen Benutzer, aber sie unterscheiden sich in mehrfacher Hinsicht. Sie wollen wahrscheinlich ein als Haupt-Test-Tool in Scala holen, müssen aber nicht das andere aufgeben, weil Sie Stücke von beiden verwenden können. Wenn Sie wie ScalaTest des FeatureSpec Syntax und Mockito Syntax Spezifikationen, zum Beispiel, können Sie beiden JAR-Dateien in Ihrem Classpath setzen und beide zur gleichen Zeit nutzen. Ich werde hier versuchen und fangen die wichtigsten Design-Philosophie Unterschiede, die ich zwischen Spezifikationen und ScalaTest bemerkt haben.

Wahrscheinlich der wichtigste philosophische Unterschied zwischen den Werkzeugen ist, dass Spezifikationen für Behavior-Driven Development (BDD) ausgelegt sind, während ScalaTest allgemeiner ist. ScalaTest bietet Eigenschaften, die Sie zusammen mischen das Verhalten, das Sie in Ihren Testklassen bevorzugen zu bekommen, einschließlich BDD, und Sie können auch Ihr eigenes Verhalten leicht definieren, wenn Sie etwas anderes wollen.

ScalaTest unterstützt BDD durch seine Spec, FeatureSpec, WordSpec, FlatSpec und GivenWhenThen Züge, und hat auch Eigenschaften, die Sie in mischen eine schöne Matcher Syntax zu erhalten. Wenn Sie „sollte“ mögen, können Sie in ShouldMatchers mischen. Wenn Sie „müssen“ mögen, können Sie in MustMatchers mischen. Aber wenn Sie wie BDD aber nicht Matcher Syntax mögen, können Sie nur eine von Spec ScalaTest die Züge nutzen, ohne in einem Matcher Merkmal zu mischen. Specs hat eine Spezifikation Klasse, die Sie erweitern, und Sie müssen das Wort „muss“ in Ihrem Matcher Ausdrücke verwenden. Ein großer philosophischer Unterschied, dass hier ist offensichtlich, dass ScalaTest gibt Ihnen viel mehr Möglichkeiten. Um diesen Raum der Wahl einfacher zu navigieren, biete ich einen Entscheidungsbaum hier:

http://www.scalatest.org/quick_start

Die Matcher Syntax unterscheidet sich auch zwischen ScalaTest und Spezifikationen. In ScalaTest habe ich versucht, wie weit sehe ich mit Operator Notation gehen könnte, und endete mit Matcher Ausdrücke auf, die sehr ähnlich wie englische Sätze zu lesen, mit Leerzeichen zwischen den Wörtern. Specs Matcher Syntax Wörter zusammen mehr mit Kamel Fall ausgeführt wird.

Specs hat mehr als Matcher ScalaTest, und dass ich denke, spiegelt einen Unterschied in der Design-Haltung. Ich schnitt tatsächlich wahrscheinlich 2/3 der Matcher Syntax I gebaut und für die Freigabe in Betracht gezogen. Ich werde mehr Matcher in zukünftigen Versionen hinzufügen, aber ich wollte sicher sein Ich wusste, dass Benutzer wollte eigentlich etwas, bevor ich es zugegeben. Allerdings ScalaTest der Matcher beinhaltet eine dynamische Eigenschaft Matcher Syntax einige dieser schlaff in Anspruch nimmt. Zum Beispiel in Specs können Sie auf einem java.io.File schreiben:

file must beDirectory

Dies wird die isDirectory aufrufen und sicherstellen, dass es wahr ist. ScalaTest hat keine besondere Matcher für java.io.Files zur Zeit, aber in ScalaTest, Sie könnten nur eine dynamische Kontrolle wie folgt verwenden:

file must be a ('directory)

Jedes Mal, wenn ein Symbol in nach be passiert, wird es verwenden Reflexion zu suchen (in diesem Fall) eine Methode oder ein Feld namens directory oder eine Methode mit dem Namen isDirectory. Es gibt auch eine Möglichkeit, dies statisch zu machen, indem ein BePropertyMatcher definieren (die in der Regel nur 2 oder 3 Zeilen Code erfordert). Also im Grunde in ScalaTest versuche ich, mehr Funktionalität mit weniger API zur Verfügung zu stellen.

Eine weitere allgemeine Design Haltung Unterschied zwischen Spezifikationen und ScalaTest beinhaltet implizite Konvertierungen. Sie standardmäßig nur eine implizite Konvertierung erhalten, wenn Sie ScalaTest verwenden, das ist derjenige, der === Betreiber auf alles legt. (Wenn Sie möchten, können Sie „deaktivieren“ diese implizite Konvertierung mit einer Zeile Code. Der einzige Grund, warum Sie benötigen würde, das zu tun ist, wenn Sie versuchen, etwas zu testen, die seine eigene === Operator hat, und Sie erhalten einen Konflikt .) ScalaTest definiert viele andere implizite Konvertierungen, aber sie Sie sie brauchen verwenden, um explizit in Ihrem Code „laden“, indem sie in einem Zug Mischen oder einen Import zu tun. Wenn Sie erweitern Klasse Specification in specs Ich glaube, Sie ziemlich Dutzende von impliziten Konvertierungen standardmäßig erhalten. Ich bin mir nicht sicher, wie viel in der Praxis wichtig, aber ich meine, die Leute wollen den Code testen, die ihre eigenen implicits verwendet, und manchmal kann es zu einem Konflikt zwischen dem Testrahmen der implicits und das des Produktionscode sein. Wenn das passiert finde ich es leichter sein kann, um das Problem in ScalaTest als Spezifikationen zu arbeiten.

Ein weiterer Unterschied in Design Haltung, die ich bemerkt habe, ist bequem mit den Betreibern. Ein Ziel, das ich hatte, war, dass jeder Programmierer an jemand anderes Testcode suchen, ScalaTest nutzt der Lage wäre, zu erraten, was der Sinn war, ohne etwas suchen in der ScalaTest Dokumentation auf. Ich wollte Code ScalaTest Client werden tot offensichtlich fallen. Eine Möglichkeit, dieses Ziel selbst manifestiert ist, dass ScalaTest über Betreiber sehr konservativ ist. Ich sehe nur fünf Betreiber in ScalaTest:

  • ===, was bedeutet, equals
  • >, was bedeutet, größer als
  • <, weniger als
  • >=, größer oder gleich
  • <=, kleiner oder gleich.

Das ist es. Also diese Dinge so ziemlich aussehen, was bedeuten. Wenn Sie sehen im Code von jemand anderem:

result should be <= 7

Meine Hoffnung ist, dass Sie nicht auf die API-Dokumentation laufen müssen zu erraten, was das <= bedeutet. Im Gegensatz dazu Spezifikationen sind viel freier mit den Betreibern. Nichts falsch, aber es ist ein Unterschied. Die Betreiber können Code prägnanter machen, aber der Nachteil ist, müssen Sie unter Umständen in der Dokumentation laufen, 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 versuchen, es machen nur etwas leichter in ScalaTest einen funktionalen Stil zu verwenden, wenn Sie eine Befestigung teilen müssen, während Specs standardmäßig setzt die Tradition des setUp und tearDown Ansatzes von JUnit populär, in dem neu zuweisen Sie vars vor jedem Test. Allerdings, wenn Sie auf diese Weise testen wollen, es ist auch sehr einfach in ScalaTest. Sie müssen nur in der BeforeAndAfter Eigenschaft mischen.

Für mehr Einblick in ScalaTest, können Sie die „Get Higher mit ScalaTest“ Präsentation sehe ich auf der 2009 Devoxx Konferenz gab hier:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about

Andere Tipps

Die wichtigsten Unterschiede sind (vor allem aus einer specs Sicht :-)):

  • ScalaTest bietet mehr „Test Stile“ als Spezifikationen (können Sie jeden Aufzählungspunkt auf der Seite eine Detailansicht auf jede Art)

  • bekommen
  • ScalaTest und Spezifikationen haben einen anderen Satz von Matcher. Sie können sie ScalaTest und < a href = "http://code.google.com/p/specs/wiki/MatchersGuide" rel = "noreferrer"> hier specs. Auf dieser Seite der Dinge, hat specs viele kleine Features, die Sie mögen, wenn Sie Ihre Spezifikation zu schreiben: xml-Matcher, Matcher Zusammensetzung (eine einfache Möglichkeit, Matcher wiederverwenden, indem sie die Umwandlung), präzise Ausfälle, detaillierte Unterschiede für lange Strings, .. .

  • Mockito eine schöne BDD Unterstützung in specs gegeben wurde: Mockito

  • specs hat Tables , die viel zu Gruppe ermöglichen von kleinen Beispiel in einer Art Tabelle (wenn Sie Operatoren verwendet werden, wie die Tabelle Begrenzungszeichen stehen können)

  • In Spezifikationen, können Sie Beispiele definieren, die als libidum verschachtelt sind und automatisch gereinigt-up auf allen Ebenen

Dieser

ist sicherlich ein sehr partieller und voreingenommen Vergleich und viele andere Unterschiede bestehen (und die Bibliotheken noch in der Entwicklung, ...).

Am Ende des Tages denke ich, dass es hängt wirklich von Ihrem Test / Spezifizierungs Stil. Wenn es einfach ist (einfache Spezifikationsstruktur, Setups, Erwartungen, ...), dann werden beide Bibliotheken sehr ähnlich erscheinen. Ansonsten haben beide ihre Sicht auf, wie die Dinge getan werden sollte. Als letztes Beispiel dafür kann man einen Blick auf Tagging hat: in ScalaTest und in specs .

Ich hoffe, das hilft.

Soweit ich weiß, ein paar hochspezialisierte Funktionen Sperre, es kommt auf die persönlichen Vorlieben entsprechend der Art.

IDE-Unterstützung kann ein weiterer Punkt sein

Ich habe versucht, Specs zu bekommen mit Eclipse durch JUnit zu arbeiten, und ich fand die offizielle Lösung ein bisschen „Hacky“ zu sein. Specs Setup: http://code.google.com/p/specs/wiki / RunningSpecs # Run_your_specification_with_JUnit4_in_Eclipse

ScalaTest die Integration (auch durch JUnit) mit scheint ein bisschen weniger hacky. Dennoch habe ich keinen von ihnen bekam sowie JUnit und Java zu arbeiten.

ScalaTest Setup: http: // Gruppen. google.com/group/scalatest-users/web/running-scalatest-from-eclipse

Wenn ein Entscheidungsfaktor ist die Kompilierung, scalatest scheint besser zu erfüllen.

Wir verwenden derzeit specs2 in unserem Projekt, leiden aber unter langsamen Zeiten in Tests kompilieren. Ich habe gerade einen POC über den Beginn scalatest und sah kompilieren mal 0,82 nur um einen Faktor von etwa fallen durch die 2-Frameworks in einigen unserer Quellen wechseln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top