As a newbie to clojure, I have used leiningen to create a sample project with
lein new app first-project
which gave me this directory
.
├── 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
Without modifying any files, I can lauch successfully the only failing test with
lein test
...
Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
Tests failed.
But I am unable to do the same from the REPL using 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}
I tried (but does not work)
(require 'first-project.core-test)
You can run tests by using the cljs. test/run-tests macro. This may be done in your REPL or at the end of your file. If you have many test namespaces it's idiomatic to create a test runner namespace which imports all of your test namespaces and then invokes run-tests .
You can run the tests by starting a REPL and then using Tools→REPL→Run Tests in Current NS in REPL - you can assign a shortcut to this action, of course. This will load the namespace containing the tests and any of its dependent namespaces (see here) in the REPL and then execute the tests from that namespace.
To start a REPL session in Eclipse, click the Menu option, go to Run As → Clojure Application. This will start a new REPL session in a separate window along with the console output.
lein test provides the ability to run all tests in a project. lein test <selector> <selector-args> allows a custom selector to be defined by a project's project. clj file in the :test-selectors key. A selector is a function that can look at a namespace or a test var and decide whether a test should run or not.
Start a REPL with lein repl
, then use require
(require '[clojure.test :refer [run-tests]]) (require 'your-ns.example-test :reload-all) (run-tests 'your-ns.example-test)
I prefer to stay in the user
namespace, as opposed to changing it with in-ns
as mentioned by another answer. Instead, pass the namespace as an argument to run-tests
(as shown above).
I'd also recommend staying away from (use 'clojure.test)
; that is why I suggested (require '[clojure.test :refer [run-tests]])
above. For more background, read http://dev.clojure.org/jira/browse/CLJ-879
In your example above the repl is in the wrong namespace. It may work better if you switch the repl to the core_test
namespace. and then run (run-tests)
.
(in-ns 'first-project.core-test)
(run-tests)
Another fun way of developing tests is to just run them from the REPL until they work, because tests are normal functions with some extra metadata.
(in-ns 'first-project.core-test)
(my-test)
Remember you have to load the file in addition to calling in-ns
Let's say your test file is tests/first_project/core_test.clj
, then you will need to call
(load "tests/first_project/core_test")
(in-ns 'first-project.core-test)
(my-test)
Keep in mind that _
in the file system becomes -
in the namespace and /
becomes .
.
To recap:
Way of require
Full qualification of functions is only needed if you issued an in-ns
earlier. Then do:
(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
; doesn't 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With