Clojure spec - тестовая проверка OutOfMemoryError - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь выполнить тестирование на основе свойств для этой простой функции:

(defn distinct-kw-keys
  [maps]
  (->> (map keys maps)
       (flatten)
       (filter keyword?)
       (distinct)
       (vec)))

... используя fdef и check:

(require '[clojure.spec.alpha :as s]
         '[clojure.spec.test.alpha :as test])

(s/fdef distinct-kw-keys
  :args (s/cat :maps (s/coll-of map?))
  :ret  (s/coll-of keyword?
                   :kind vector?
                   :distinct true))

(test/check `distinct-kw-keys)

Вызов test/check завершается через некоторое время, бросая OutOfMemoryError:

Exception in thread "Timer-1" Error printing return value (OutOfMemoryError) at clojure.test.check.generators/choose$fn (generators.cljc:260). Java heap space и т. Д.

Я не могу понять, в чем здесь проблема. Функция и характеристики работают нормально, например

(require '[clojure.spec.gen.alpha :as gen])

(s/valid?
 (s/coll-of keyword?
            :kind vector?
            :distinct true)
 (distinct-kw-keys
  (gen/generate
   (s/gen
    (s/coll-of map?))))) ;; => true

1 Ответ

0 голосов
/ 21 января 2019

Он работает на моем компьютере (Macbook Pro 2015, 16 ГБ памяти), поэтому я не могу воспроизвести вашу проблему.

Чтобы уменьшить количество генеративных тестов, вы можете написать:

(test/check `distinct-kw-keys {:clojure.spec.test.check/opts {:num-tests 1}})

Изменение вашей функции с использованием преобразователей, оно может быть немного быстрее:

(defn distinct-kw-keys
  [maps]
  (into []
        (comp (mapcat keys)
              (filter keyword?)
              (distinct))
        maps))

(test/check `distinct-kw-keys)
;;=> ({:spec #object[clojure.spec.alpha$fspec_impl$reify__2524 0x18025ced "clojure.spec.alpha$fspec_impl$reify__2524@18025ced"], :clojure.spec.test.check/ret {:result true, :pass? true, :num-tests 1000, :time-elapsed-ms 26488, :seed 1548072234986}, :sym user/distinct-kw-keys})

...