Clojure测试框架的优势?

bsh*_*nks 14 testing unit-testing clojure

您更喜欢哪一个?为什么?各自的优点和缺点是什么?在哪种情况下,每个都比其他情况更胜一筹?

我对midje与clojure.test特别感兴趣,但也可以自由地提出其他Clojure测试框架.

另请参阅Clojure的最佳单元测试框架?(这个问题的答案没有详细说明"为什么").

mik*_*era 11

我没有尝试过所有这些,但我喜欢普通的老式clojure.test,原因如下:

  • 它已经存在于Clojure API中:没有额外的依赖项.
  • 与Maven集成良好:我使用带有clojure-maven-plugin的Eclipse来确保每次构建时Clojure和Java测试都会自动运行.
  • 这很简单:我在测试中需要的99%只是为了能够编写一组结构良好的断言,clojure.test使这很容易

示例代码:

(testing "Arithmetic"
  (testing "with positive integers"
    (is (= 4 (+ 2 2)))
    (is (= 7 (+ 3 4))))
  (testing "with negative integers"
    (is (= -4 (+ -2 -2)))
    (is (= -1 (+ 3 -4)))))
Run Code Online (Sandbox Code Playgroud)


Ale*_*sky 11

我更喜欢Midje.Midje提供了从clojure.test到更灵活,可读,抽象和优雅的测试风格的迁移路径.

Midje支持自上而下和自下而上的TDD风格,并且具有模拟和存根设施,以及一些强大的功能,如跳棋,metaconstants,表格事实.

Midje wiki

这是一个简单的例子:

(fact "Midje can do simple stubbing"
  (+ (a) 2) => 5
  (provided 
    (a) => 3))
Run Code Online (Sandbox Code Playgroud)


Jak*_*ary 5

我喜欢的期望clojure.test人性化的测试输出。这两个选项都给出了最易读的错误并提供了相当少的语法。

clojure.test 示例

鉴于以下测试,您将获得以下输出。

(deftest map-comparisons
  (is (= {:sheep 1} {:cheese 1 :sheep 1})))
Run Code Online (Sandbox Code Playgroud)

默认 clojure.test 输出

FAIL in (map-comparisons) (map_test.clj:5)
expected: (= {:sheep 1} {:cheese 1, :sheep 1})
  actual: (not (= {:sheep 1} {:cheese 1, :sheep 1}))
Run Code Online (Sandbox Code Playgroud)

clojure.test 输出与humane-test-output 示例

FAIL in (map-comparisons) (map_test.clj:5)
expected: {:sheep 1}
  actual: {:cheese 1, :sheep 1}
    diff: + {:cheese 1}
Run Code Online (Sandbox Code Playgroud)

期望示例

测试看起来像:

(expect {:sheep 1} {:sheep 1, :cheese 1})
Run Code Online (Sandbox Code Playgroud)

期望输出

failure in (map_expectations.clj:6) : example.map-expectations
(expect {:sheep 1} {:sheep 1, :cheese 1})

           expected: {:sheep 1}
                was: {:cheese 1, :sheep 1}

           in expected, not actual: null
           in actual, not expected: {:cheese 1}
Run Code Online (Sandbox Code Playgroud)

我对四个主要 Clojure 测试库的输出进行了更详细的比较,可以在此处找到。