Как сгенерировать тестируемую тестируемую функцию с необходимыми для тестирования различными граничными случаями для каждого выполнения?
Привет эксперты Clojure..!,
Обновление: 03/03/2018 13:25 CDT - Перефразировал вопрос, чтобы сделать его более наглядным.
Обновление: 03.08.2008 16:10 CDT - добавлен тест с отрицательным сценарием, чтобы сделать его более понятным.
У меня есть тестируемая функция / спецификация (jvm-languages), я хочу проверить положительный сценарий (на данный момент), используя API генеративного теста Clojure.
Тест положительного сценария: Учитывая, что язык jvm является одним из пяти {"clojure" "haskell" "erlang" "scala" "python"}, результат должен быть истинным.
Мой вопрос / требование: я должен хотеть проверять свою тестируемую функцию с каждым возможным сценарием (который я перечислил в наборе ниже) для каждого выполнения (каждый раз, когда я запускаю тест lein), чтобы я мог избавиться регулярных юнит-тестов.
Согласно моим небольшим знаниям по тестированию, я думаю, что нет смысла (для меня) тестировать свою функцию несколько раз с одним и тем же сценарием тестирования в одном и том же исполнении. Пожалуйста, просветите меня, если вы думаете, что мой мыслительный процесс неправильный.
- Есть ли способ выполнить мой сценарий использования с помощью генеративного тестирования Clojure?
Если нет, разве это не отличная возможность иметь?
(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))))