从Clojure Repl和Leiningen运行测试

时间:2014-01-22 21:25:59

标签: clojure 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.

但是我无法使用run-tests

从REPL做同样的事情
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)

3 个答案:

答案 0 :(得分:56)

使用lein repl启动REPL,然后:

(require '[clojure.test :refer [run-tests]])
(require 'your-ns.example-test)
(run-tests 'your-ns.example-test)

我更喜欢留在user命名空间,而不是像another answer所提到的那样使用in-ns进行更改。相反,将名称空间作为参数传递给run-tests(如上所示)。

我还建议远离(use 'clojure.test);这就是为什么我在上面提出(require '[clojure.test :refer [run-tests]])。有关更多背景信息,请阅读http://dev.clojure.org/jira/browse/CLJ-879

答案 1 :(得分:16)

在上面的示例中,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 :(得分:0)

回顾:

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