Clojure测试框架的优势是什么?

14

你更喜欢哪一个,为什么?每个的优缺点是什么?在哪种情况下,每个都比其他测试框架更出色?

我特别关注midje vs. clojure.test,但也可以提及其他Clojure测试框架。

另请参见最佳的Clojure单元测试框架是什么?(该问题的答案没有提供太多关于“为什么”的细节)。


同样的问题,人们如何将他们的测试运行并行化?似乎没有一个框架可以立即适应在成千上万个测试中并行运行并在最后整洁地收集结果。 - river
可能是最佳Clojure单元测试框架?的重复问题。 - Alex Baranosky
嘿@andy,好问题。Midje也不支持并行测试运行,我想知道是否有一种方法可以调整它以启用并行。我将打开一个问题:https://github.com/marick/Midje/issues/108 - Alex Baranosky
3个回答

11

我更喜欢Midje。Midje提供了从clojure.test到更灵活、可读性更强、抽象度更高和更友好的测试风格的迁移路径。

Midje支持自上而下以及自下而上的TDD风格,并且内置了模拟和存根设施,以及一些强大的功能,如检查器(checkers)、元常量(metaconstants)、表格事实(tabular facts)等。

Midje wiki

这是一个简单的例子:

(fact "Midje can do simple stubbing"
  (+ (a) 2) => 5
  (provided 
    (a) => 3))

1
Midje同样拥有出色、全面的文档,这无疑是使它与clojure.test不同的一个方面。 - Tim Gilbert
请注意,Midje在加载命名空间时执行测试!因此,当您的测试运行时间较长或者您想使用语法检查器或其他代码分析工具时,会有些麻烦。而Midje只提供了禁用检查的选项,而不是解开这两个问题的纠缠,这最终将简化开发过程。这不太好。 - Petr Gladkikh

11

虽然我没有尝试过所有的测试框架,但我喜欢最基本的clojure.test,理由如下:

  • 已经包含在Clojure API中:无需额外的依赖。
  • 与Maven集成良好:我使用Eclipse和clojure-maven-plugin来确保每当我构建时都会自动运行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)))))

5
我更喜欢使用expectations或者带有humane-test-outputclojure.test进行测试,这两个选项都能提供易于阅读的错误信息并具有相对较少的语法。

clojure.test示例

给定以下测试代码,下面是相应的输出内容。

(deftest map-comparisons
  (is (= {:sheep 1} {:cheese 1 :sheep 1})))

默认的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}))

使用humane-test-output的clojure.test输出示例

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

期望示例

测试如下:

(expect {:sheep 1} {:sheep 1, :cheese 1})

期望输出

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}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接