Как отключить тестовые таблицы, если в текущем пространстве имен нет тестов?
Я видел много проектов 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))