Andere Sprachen verfügen über eigenschaftsbasierte Testbibliotheken wie Haskell QuickCheck. Wie unterscheidet sich Clojure spec von solchen Bibliotheken? Oder ist es nur ein eigenschaftsbasiertes Testframework für Clojure?Wie unterscheidet sich Clojure spec von eigenschaftsbasierten Testbibliotheken wie Haskell QuickCheck?
Antwort
Clojure Analog für QuickCheck wäre test.check. Clojure.spec stützt sich auf test.check für Generative Testing, aber Spec kann für viel mehr als Tests verwendet werden.
Test.check bietet Tools für generatives und eigenschaftsbasiertes Testen. Clojure.spec ermöglicht es Ihnen, Spezifikationen für Daten zu schreiben, und Generatoren aus diesen Spezifikationen automatisch erstellen können. Wenn Sie test.check allein verwenden, müssen Sie nicht-triviale Generatoren manuell erstellen. Mit clojure.spec können Generatoren (mit einigen Ausnahmen) von Ihrer Spezifikation abgeleitet werden.
(s/def ::my-spec string?) ;; a trivial spec, any string will do
(sgen/sample (s/gen ::my-spec)) ;; create a generator from spec and get samples
;;=> ("" "P" "B" "" "qV" "im4P" "Zf" "" "rL24" "wAV7z")
Diese Generatoren können verwendet werden, um Eingabedaten für Funktionen zu generieren, deren Eigenschaften Sie testen möchten. Sie können eigenschaftsbasierte Tests nur mit test.check schreiben, und Sie können auch einige eigenschaftsbasierte Tests für Funktionen mit clojure.spec schreiben. Hier ist ein Beispiel einer Funktion, die einen String und gibt die „verdoppelt“ string:
(defn doubler [s] (str s s))
(s/fdef doubler
:args (s/cat :s string?)
:ret string?
:fn (fn [{:keys [args ret]}]
(= (* 2 (count (:s args))) (count ret))))
(stest/check `doubler)
Die s/fdef
spec definiert die Eigenschaften wir unserer Funktion wollen: es eine Zeichenfolge nimmt, liefert einen String, und die Die zurückgegebene Zeichenfolge sollte doppelt so lang wie die Eingabe sein. Wir verwenden check
, um sicherzustellen, dass diese Eigenschaften für eine Reihe zufällig generierter Eingaben gelten.
Was unterscheidet Spec von [test.check] (https://github.com/clojure/test.check) ist nur seine Fähigkeit, Testgeneratoren automatisch zu erstellen? Unterscheidet das auch Spec von QuickCheck? Könnten Sie einige Beispiele für spezielle Anwendungen außerhalb des Tests vorstellen? – dilvan
Es gibt keinen Grund, * clojure.spec mit test.check oder einer anderen eigenschaftsbasierten Testbibliothek zu vergleichen; es hat viele Verwendungen und Zwecke, die über das Testen hinausgehen, dessen Kern Schreiben von Spezifikationen für Datenstrukturen ist. Die verknüpfte Übersicht erklärt dies sehr gut, und der verlinkte Leitfaden enthält viele Beispiele für die Verwendung von Spezifikationen außerhalb von Tests. –
Wenn Sie Spezifikationen für Datenstrukturen sagen, meinen Sie für den menschlichen Verzehr? Oder gibt es etwas, was ein Programm (neben dem Testen) damit machen kann? – dilvan
- 1. Haskell Cabal QuickCheck Integration
- 2. Wie unterscheidet sich ein Transducer von einer teilweise angewandten Funktion?
- 3. Wie unterscheidet sich spec/rails_helper.rb von spec/spec_helper.rb? Brauche ich es?
- 4. Clojure Spec Abhängige Felder
- 5. Clojure spec und Plattenbauer
- 6. Haskell Generieren von Graphen mit QuickCheck-Eigenschaften
- 7. Wie unterscheidet sich Hashtable
- 8. Strukturdefinitionscode von clojure spec/keys wiederverwenden
- 9. Spring Data JPA und SQL Server:% wie% Verhalten unterscheidet sich von JPQL spec
- 10. Wie unterscheidet sich SystemVerilog 0 von '0?
- 11. Wie unterscheidet sich Gitlab von Github?
- 12. Wie unterscheidet sich << von +?
- 13. Wie unterscheidet sich Kaa von Kura?
- 14. GCC: Wie unterscheidet sich März von Mtune?
- 15. Wie unterscheidet sich Docker Swarm von Kubernetes?
- 16. Wie unterscheidet sich mapPartition von der Karte?
- 17. Wie unterscheidet sich das Armspeichermodell von ia64?
- 18. Wie unterscheidet sich ArrayListMultimap von LinkedListMultimap?
- 19. Wie unterscheidet sich MegaStore von BigTable?
- 20. Wie unterscheidet sich Gurke von JUnit?
- 21. Wie unterscheidet sich mein Netzwerk von Bitcoin
- 22. Wie Sammlung unterscheidet sich von Schema
- 23. Wie unterscheidet sich mpi_file_write von mpi_file_write_all?
- 24. Wie unterscheidet sich os.system von der Befehlszeile?
- 25. Wie unterscheidet sich die Rechtecksgrenze?
- 26. Wie unterscheidet man Java-Karte von Clojure Karte?
- 27. Haskell QuickCheck Best Practices (besonders beim Testen von Klassen)
- 28. Warum unterscheidet sich {} + [] von ({} + [])?
- 29. Clojure spec: Wie validieren entweder die eine oder andere Karte
- 30. Clojure spec coerce verschachtelt Karte Wert
Siehe auch "Was ist Spec" https://StackOverflow.com/a/38518300/1327651 – nha