2017-10-18 4 views

Antwort

7

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.

Werfen Sie einen Blick auf die overview und guide für mehr.

+0

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

+1

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. –

+0

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

Verwandte Themen