2009-12-08 6 views
3

Les deux Junit et TestNG fournissent des mécanismes pour l'itération sur une collection de paramètres d'entrée et l'exécution de vos tests par rapport à eux. Dans Junit, ceci est pris en charge via le Parameterized annotation, tandis que TestNG utilise @DataProvider.Comment "paramétrer" le test de Clojure Contrib?

Comment pouvez-vous écrire des tests pilotés par données à l'aide de la bibliothèque test-is ? J'ai essayé d'utiliser pour la compréhension de liste pour parcourir une collection de paramètres d'entrée, mais parce que deftest est une macro attend est clauses.

Répondre

7

de lire l'article sur les tests paramétrés en Junit il semble qu'une fois que vous avez passé la plaque poiler la partie froide de paramétrisation est qu'il vous permet de taper ceci:

 return Arrays.asList(new Object[][] { 
      { 2, true }, 
      { 6, false }, 
      { 19, true }, 
      { 22, false } 

et facilement définir quatre tests.

en test est l'équivalent (pas de code-plaque de la chaudière requise) macro est are

(are [n prime?] (= prime? (is-prime n)) 
    3 true 
    8 false) 

Si vous voulez donner à vos entrées comme une carte vous pouvez alors exécuter quelque chose comme:

(dorun (map #(is (= %2 (is-prime %1)) 
      { 3 true, 8 false})) 

bien que la macro are produise une sortie plus facilement lisible.

2

Je ne suis pas certain de comprendre le but des tests paramétrés, mais j'utiliserais la liaison dynamique pour cela.

user> (def *test-data* [0 1 2 3 4 5]) 
#'user/*test-data* 

user> (deftest foo 
     (doseq [x *test-data*] 
      (is (< x 4)))) 
#'user/foo 
user> (run-tests) 

Testing user 

FAIL in (foo) (NO_SOURCE_FILE:1) 
expected: (< x 4) 
    actual: (not (< 4 4)) 

FAIL in (foo) (NO_SOURCE_FILE:1) 
expected: (< x 4) 
    actual: (not (< 5 4)) 

Ran 1 tests containing 6 assertions. 
2 failures, 0 errors. 
nil 

user> (defn run-tests-with-data [data] 
     (binding [*test-data* data] (run-tests))) 
#'user/run-tests-with-data 

user> (run-tests-with-data [0 1 2 3]) 

Testing user 

Ran 1 tests containing 4 assertions. 
0 failures, 0 errors. 
nil 

Vous pouvez réécrire deftest et run-tests vous. Ce serait peut-être une douzaine de lignes de Clojure pour laisser les tests accepter les paramètres d'une autre manière.

Questions connexes