Как сгенерировать тестируемую тестируемую функцию с необходимыми для тестирования различными граничными случаями для каждого выполнения?

Привет эксперты Clojure..!,

Обновление: 03/03/2018 13:25 CDT - Перефразировал вопрос, чтобы сделать его более наглядным.

Обновление: 03.08.2008 16:10 CDT - добавлен тест с отрицательным сценарием, чтобы сделать его более понятным.

У меня есть тестируемая функция / спецификация (jvm-languages), я хочу проверить положительный сценарий (на данный момент), используя API генеративного теста Clojure.

Тест положительного сценария: Учитывая, что язык 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"}
    

1 ответ

Решение

Я бы просто повторил коллекцию, так как вы все равно хотите проверить каждый случай.

Вы можете получить довольно хороший код для чтения, используя is а также 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))))
Другие вопросы по тегам