1

你好 Clojure 专家..!,

更新:2018 年 8 月 3 日下午 1:25 CDT - 重新表述了问题以使其更具描述性。

更新:2018 年 8 月 3 日下午 4:10 CDT - 添加了负面情景测试以使其更有意义。

我有一个正在测试的函数/规范(jvm 语言),我想使用 Clojure 生成测试 API 测试正面场景(现在)。

正面场景测试:鉴于 jvm 语言是五个 {"clojure" "haskell" "erlang" "scala" "python"} 之一,结果应该是正确的。

我的问题/要求:我应该用每个可能的有效场景(我在下面的一组中列出)为每次执行(每次我运行,lein 测试)测试我的被测函数,以便我可以摆脱定期单元测试。

根据我的少量测试知识,我认为(对我来说)在同一执行中使用相同的测试场景多次测试我的功能没有任何价值。如果您认为我的思维过程是错误的,请教育我。

  1. 有没有办法使用 Clojure 生成测试来完成我的用例?
  2. 如果没有,这不是一个很棒的功能吗?

       (ns spec.gen-test.explore
    (:require [clojure.test                    :refer :all]
          [clojure.spec                    :as spec]
          [clojure.test.check.generators   :as gen]
          [clojure.test.check.properties   :as prop :include-macros true]
          [clojure.test.check.clojure-test :refer [defspec]]))
    (def languages-set #{"clojure" "haskell" "erlang" "scala" "python"})
    
    (spec/def ::jvm-languages 
    (spec/and string?
     languages-set))
    
    ;;Generative test case for jvm-languages spec:
    (defspec jvm-languages-positive-generative-test
     5
     (prop/for-all [language (gen/elements ["clojure" "haskell" "erlang" 
     "scala" "python"])]
                (println "Testing for language:" language)
                (spec/valid? ::jvm-languages language)))
    
    (defspec jvm-languages-negative-generative-test
      100
      (prop/for-all [language (gen/such-that
                               #(not (contains? languages-set %))
                               (gen/one-of
                                 [ gen/string
                                   (gen/elements ["" nil])
                                   gen/int
                                   gen/keyword
                                   gen/char-alphanumeric
                                   gen/double ]))]
                (println "Testing for language:" language)
                (not (spec/valid? ::jvm-languages language))))
    (run-tests)
    
    Output: 
    #'spec.gen-test.explore/jvm-languages-positive-generative-test
    Testing for language: scala
    Testing for language: haskell
    Testing for language: erlang
    Testing for language: erlang
    Testing for language: scala
    {:result true, :num-tests 5, :seed 1533232724897, :test-var "jvm-languages-generative-test"}
    
4

1 回答 1

0

我只是迭代集合,因为无论如何您都想测试每个案例。

is您可以使用and获得一些相当不错的阅读代码every?

(ns your-ns
  (:require [clojure.test :refer [is testing]]))

(let [test-cases ["clojure" "haskell" "erlang" "scala" "python"]]
  (testing "if my things are working."
    ; Just iterating the test cases using every?
    (is (every? #(your-test-predicate-here %) test-cases))))
于 2018-08-02T14:37:54.900 回答