Запустите один тест Clojure (не все тесты в пространстве имен) с приборами из REPL

Как запустить один тест (не целое пространство имен) из Clojure REPL?

Я пытался вызвать функцию напрямую, например (the-ns/the-test) но мне нужны светильники для запуска в первую очередь. Поэтому я хочу найти способ начать тестирование с clojure.test,

Это близко, но не подходит для того, что я хочу сделать: /questions/18892311/vyipolnite-testyi-ot-clojure-repl-i-leiningen/18892318#18892318

Я не вижу упоминаний о том, как это сделать из API clojure.test.

4 ответа

Решение

В Clojure 1.6 была добавлена ​​новая функция для поддержки этого. clojure.test / test-vars будет запускать один или несколько тестовых переменных с фиксаторами.

Я думаю, что-то вроде этого должно работать:

(clojure.test/test-vars [#'the-ns/the-test])

Чтобы запустить один тест в пространстве имен:

lein test :only namespace_name/testname

Чтобы запустить все тесты в одном пространстве имен

lein test :only namespace_name

Если вы не возражаете против использования приборов, вы можете сделать следующее, прежде чем позвонить run-tests:

(defn test-ns-hook []
  (my-test))

Чтобы снять крючок, вы можете сделать

(ns-unmap *ns* 'test-ns-hook)

Если вам все еще нужны ваши приборы и вы хотите остаться с одним тестовым пространством имен, вы можете добавить ns-unmap удалить все тесты / приборы, которые вы не хотите запускать, из пространства имен перед запуском ваших тестов, смоделированных на что-то вроде:

(doseq [v (keys (ns-publics 'my-ns))]
  (let [vs (str v)]
    (if (.startsWith vs "test-") (ns-unmap 'my-ns v))))

Может быть проще работать с несколькими пространствами имен, в одном из которых содержатся все ваши тесты и приспособления, а в других пространствах имен refer к тестам и приборам, которые вы хотите запустить из основного пространства имен тестов. Вы могли бы тогда использовать ns переключиться на конкретное тестовое пространство имен или пройти run-tests пространства имен, которые вы хотите проверить:

(ns test-main
  (:require [clojure.test :refer :all]))

(deftest addition
  (is (= 4 (+ 2 2)))
  (is (= 7 (+ 3 4))))

(deftest subtraction
  (is (= 1 (- 4 3)))
  (is (= 3 (- 7 4))))

(run-tests)
;Runs all the tests

(ns test-specific
(:require [clojure.test :refer :all]
          [test-main :refer :all]))

(deftest arithmetic
  (subtraction))

(run-tests)
;Just runs the tests you want

Хорошая альтернатива clojure.test (если вы в порядке, добавьте дополнительные зависимости eftest). Эта библиотека является альтернативным раннером (она совместима с clojure.test). Он имеет гибкие селекторы тестов (т.е. по папке, по пространству имен, по var).

В REPL вы можете выполнить что-то вроде этого:

(require '[eftest.runner :refer [find-tests run-tests]]) (run-tests (find-tests #'foo.bar/baz))

Смотрите https://github.com/weavejester/eftest

Другие вопросы по тегам