如何比较clojure中的数据结构并突出显示差异

时间:2013-12-14 17:37:19

标签: testing clojure

有没有一种很好的方法来打印出clojure数据结构的差异?例如,在Perl中,Test::Differences有很多帮助。

5 个答案:

答案 0 :(得分:10)

看看clojure.data/diff:http://clojure.github.io/clojure/clojure.data-api.html#clojure.data/diff

示例:

async-demo.core> (use 'clojure.data)
nil
async-demo.core> (diff {:a 2 :b 4} {:a 2})
({:b 4} nil {:a 2})
async-demo.core> (diff [1 2 3 4] [1 2 6 7])
[[nil nil 3 4] [nil nil 6 7] [1 2]]
async-demo.core> (diff #{"one" "two" "three"} #{"one" "fourty-four"})
[#{"two" "three"} #{"fourty-four"} #{"one"}]

答案 1 :(得分:4)

您还可以使用gui-diff库在视觉上区分两个数据结构。

(gui-diff {:a 1} {:a 2})将向适合OS的gui diffing程序发出异议,以区分两个可能非常大的数据结构。

答案 2 :(得分:2)

我真正搜索的是difform。使用clojure.data/diff很不错,但在比较较大结构的单元测试中效果不佳。以下是data/diff在我看来表现不同的例子:

(defn example []
  (let [data [{:foo 1} {:value [{:bar 2}]}]]
    (diff data
          [{:value [{:bar 2}]}])

    (difform data
          [{:value [{:bar 2}]}])))

;; => diff output
;; => [[{:foo 1} {:value [{:bar 2}]}] [{:value [{:bar 2}]}] nil]

;; => difform output
   [{:
 - foo 1} {:
   value [{:bar 2}]}]
;; => nil

答案 3 :(得分:0)

Differ是一个最近的图书馆,似乎做得很好:

(def person-map {:name "Robin"
                 :age 25
                 :sex :male
                 :phone {:home 99999999
                         :work 12121212})

(def person-diff (differ/diff person-map {:name "Robin Heggelund Hansen"
                                          :age 26
                                          :phone {:home 99999999})

;; person-diff will now be [{:name "Robin Heggelund Hansen"
;;                           :age 26}
;;                          {:sex 0
;;                           :phone {:work 0}]

已编辑:修复从gitlab更改为GitHub的差异repo URL

答案 4 :(得分:0)

我看到的最差的差异是 deep-diff

它会像这样产生漂亮的彩色差异

enter image description here

还提到了不错的 editscript lib whick可以将diff作为补丁数组来产生。