Clojure 内置了测试框架 clojure.test,它很简单好用。但喜欢其他测试风格的人们也完成了不少其他框架。例如 Midje。它的设计目标是支持从顶到下的测试,很容易写出隔离调用的真正的单元测试:

clojure(defn my-formula [n]
   (+ (pow n 2) 5))

(fact "my-formula 函数使用 pow 函数结果加上5"
   (my-formula 3) => 5
      (provided (pow 3) => 0)) 

通过 provided 段,就成功地将 pow 函数的效果在测试中本地化。这样不论 pow 函数内部的逻辑是否正确,我们的这个 fact 能独立地验证 my-formular 函数的正确性。

当然,我们注意到这种做法是白盒测试,上述测试的另一个好处是明确地说明了 my-formula 函数的依赖。

Midje 的其他方便性在于其语法,非常简洁清晰,当然有点不 clojure。它的左边一般不加什么处理,仅仅是被测函数调用,而右边不仅仅是结果,不光能进行等值测试,还可以用测试函数来比较。

clojure(fact
  (sort [3 1 4 2]) => (just #{1 2 3 4}))

例如常用的 just 比较函数,可以”聪明匹配“,它看到自己的参数是一个 set,就知道我们仅关心结果的内容,而非其次序。要比 clojure.test 中我们的写法更为清晰:

clojure(is (= #{1 2 3 4} (hash-set (sort [3 1 4 2])))) 

Midje 的其他用法请看它自己的文档


robertluo
738 声望21 粉丝

引用和评论

0 条评论