Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run tests from Clojure Repl and Leiningen

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)
like image 882
anotherCode245 Avatar asked Jan 22 '14 21:01

anotherCode245


People also ask

How do you run a test in Clojure?

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 .

How do I run a test in REPL?

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.

How do I launch REPL in Clojure?

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.

What is lein test?

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.


3 Answers

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

like image 64
David J. Avatar answered Sep 19 '22 04:09

David J.


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 ..

like image 22
Arthur Ulfeldt Avatar answered Sep 22 '22 04:09

Arthur Ulfeldt


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.
like image 30
David Tonhofer Avatar answered Sep 19 '22 04:09

David Tonhofer