Выполнить тесты из Clojure Repl и Leiningen
Как новичок в clojure, я использовал leiningen для создания образца проекта с
lein new app first-project
который дал мне этот каталог
.
├── doc
│ └── intro.md
├── LICENSE
├── project.clj
├── README.md
├── resources
├── src
│ └── first_project
│ └── core.clj
├── target
│ └── repl
│ ├── classes
│ └── stale
│ └── extract-native.dependencies
└── test
└── first_project
└── core_test.clj
Без изменения каких-либо файлов я могу успешно выполнить единственный неудачный тест с
lein test
...
Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
Tests failed.
Но я не могу сделать то же самое из REPL, используя run-tests
lein repl
first-project.core=> (use 'clojure.test)
nil
first-project.core=> (run-tests)
Testing first-project.core
Ran 0 tests containing 0 assertions.
0 failures, 0 errors.
{:type :summary, :pass 0, :test 0, :error 0, :fail 0}
Я пробовал (но не работает)
(require 'first-project.core-test)
Ответы
Ответ 1
В приведенном выше примере repl находится в неправильном пространстве имен. Это может работать лучше, если вы переключите repl в пространство имен core_test
. а затем запустите (run-tests)
.
(in-ns 'first-project.core-test)
(run-tests)
Еще один интересный способ разработки тестов - просто запустить их из REPL до тех пор, пока они не будут работать, потому что тесты являются нормальными функциями с некоторыми дополнительными метаданными.
(in-ns 'first-project.core-test)
(my-test)
Помните, что вам нужно загрузить файл в дополнение к вызову in-ns
. Скажем, ваш тестовый файл tests/first_project/core_test.clj
, тогда вам нужно будет позвонить
(load "tests/first_project/core_test")
(in-ns 'first-project.core-test)
(my-test)
Имейте в виду, что _
в файловой системе становится -
в пространстве имен, а /
становится .
.
Ответ 2
Начните REPL с lein repl
, затем используйте require
(require '[clojure.test :refer [run-tests]])
(require 'your-ns.example-test :reload-all)
(run-tests 'your-ns.example-test)
Я предпочитаю оставаться в пространстве имен user
, а не менять его на in-ns
, как упоминалось в другом ответе. Вместо этого передайте пространство имен в качестве аргумента run-tests
(как показано выше).
Я также рекомендовал бы держаться подальше от (use 'clojure.test)
; вот почему я предложил (require '[clojure.test :refer [run-tests]])
выше. Для получения дополнительной информации читайте http://dev.clojure.org/jira/browse/CLJ-879
Ответ 3
Напомним:
Путь require
Полная квалификация функций необходима только в том случае, если вы выпустили in-ns
ранее. Затем выполните:
(clojure.core/require '[clojure.core :refer [require]]
'[clojure.test :refer [run-tests]]
'[clojure.repl :refer [dir]])
; Load whatever is in namespace "foo.bar-test" and reload everything
; if ':reload-all' has been additionally given
(require 'foo.bar-test :reload-all)
;=> nil
; List your tests for good measure (Note: don't quote the namespace symbol!)
(dir foo.bar-test)
;=> t-math
;=> t-arith
;=> t-exponential
;=> nil
; Check meta-information on a test to verify selector for example
(meta #'foo.bar-test/t-math)
;=> {:basic-math true, :test #object[foo.bar_tes...
; 'run-tests' will probably run nothing because the current namespace
; does not contain any tests, unless you have changed it with "in-ns"
(run-tests)
;=> Ran 0 tests containing 0 assertions.
; run tests by giving namespace explicitly instead
(run-tests 'foo.bar-test)
;=> Ran 3 tests containing 29 assertions.