2017-10-18 20 views

Répondre

7

analogique de Clojure pour QuickCheck serait test.check. Clojure.spec s'appuie sur test.check pour les tests génératifs, mais spec peut être utilisé pour bien plus que tester.

Test.check fournit des outils pour les tests générative et basée sur la propriété. Clojure.spec vous permet d'écrire spécifications pour les données, et peut créer des générateurs à partir de ces spécifications automatiquement. En utilisant test.check seul, vous devrez créer des générateurs non triviaux à la main. Avec clojure.spec, les générateurs peuvent (à quelques exceptions près) être dérivés de votre spécification.

(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") 

Ces générateurs peuvent être utilisés pour générer des données d'entrée pour les fonctions dont vous voulez tester les propriétés. Vous pouvez écrire des tests basés sur des propriétés en utilisant simplement test.check, et vous pouvez également écrire des tests basés sur des propriétés pour les fonctions en utilisant clojure.spec. Voici un exemple d'une fonction qui prend une chaîne et retourne le « doublé » 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) 

La spécification s/fdef définit les propriétés que nous voulons de notre fonction: il faut une chaîne, renvoie une chaîne, et La chaîne renvoyée doit être deux fois plus longue que l'entrée. Nous utilisons check pour nous assurer que ces propriétés correspondent à un ensemble d'entrées générées de façon aléatoire.

Jetez un oeil à la overview et guide plus.

+0

Qu'est-ce qui différencie spec de [test.check] (https://github.com/clojure/test.check) est seulement sa capacité à créer automatiquement des générateurs de test? Est-ce aussi ce qui différencie spec de QuickCheck? Pourriez-vous présenter quelques exemples d'utilisations en dehors des tests? – dilvan

+1

Il n'y a aucune raison de * comparer * clojure.spec avec test.check ou toute autre bibliothèque de tests basée sur la propriété; il a de nombreux usages et objectifs au-delà du test, dont le cœur est l'écriture de * spécifications * pour les structures de données. L'aperçu lié explique parfaitement cela, et le guide lié contient de nombreux exemples d'utilisation des spécifications en dehors des tests. –

+0

Quand vous parlez de spécifications pour les structures de données, voulez-vous dire pour la consommation humaine? Ou y at-il quelque chose qu'un programme peut faire avec (en dehors des tests)? – dilvan