Как отключить тестовые таблицы, если в текущем пространстве имен нет тестов?

Я видел много проектов clojure, которые по умолчанию отключают интеграционные тесты, добавляя этот параметр в project.clj:

:test-selectors {:default (complement :integration)
                 :integration :integration}

Но, если пространство имен содержит только интеграционные тесты, приборы в нем все еще работают, когда я запускаю lein test!

Например, если я бегу lein new app test и сделать содержимое core_test.clj этот:

(defn fixture [f]
  (println "Expensive setup fixture is running")
  (f))
(use-fixtures :once fixture)

(deftest ^:integration a-test
  (println "integration test running"))

Затем, когда я бегу lein test Я вижу, что прибор работает, хотя тесты не проводятся.

Какой правильный способ справиться с этим в ближайшем будущем?

2 ответа

Решение

Один из способов не запускать дорогостоящие вычисления - воспользоваться тем, что, хотя :once Светильники будут работать независимо от того, есть ли тесты для запуска в нс или нет, :each Светильники будут работать только на каждом реально работающем тесте.

Вместо выполнения реальных вычислений (или получения ресурсов, таких как соединение с БД, или выполнения каких-либо побочных эффектов) в :once Приспособление, мы делаем это только в первый раз (мы хотим сделать это только один раз!) :each приспособление, например, сделав следующее:

(def run-fixture? (atom true))

(defn enable-fixture [f]
  (println "enabling expensive fixture...")
  (try
    (f)
    (finally (reset! run-fixture? true))))

(defn expensive-fixture [f]
  (if @run-fixture?
    (do
      (println "doing expensive computation and acquiring resources...")
      (reset! run-fixture? false))
    (println "yay, expensive thing is done!"))
  (f))

(use-fixtures :once enable-fixture)
(use-fixtures :each expensive-fixture)

(deftest ^:integration integration-test
  (println "first integration test"))

(deftest ^:integration second-integration-test
  (println "second integration test"))

Выход из lein test будет следующим (обратите внимание, как enable-fixture побежал но не дорого expensive-fixture):

› lein test

lein test fixture.core-test
enabling expensive fixture...

Ran 0 tests containing 0 assertions.
0 failures, 0 errors.

При беге lein test :integration, expensive-fixture будет работать ровно один раз:

› lein test :integration

lein test fixture.core-test
enabling expensive fixture...
doing expensive computation and acquiring resources...
first integration test
yay, expensive thing is done!
second integration test

Ran 2 tests containing 0 assertions.
0 failures, 0 errors.

Кажется, что прибор работает независимо от того, запускаются ли тесты. Затем вы можете поместить функциональность прибора в сам тест, чтобы "вручную" контролировать эту настройку / демонтаж. псевдокод:

(defn run-all-tests []
  (do-test-1)
  ...
  (do-test-N))

(deftest ^:slow mytest
  (do-setup)
  (run-all-tests)
  (do-teardown))
Другие вопросы по тегам