从Clojure Repl和Leiningen运行测试

ano*_*245 34 clojure leiningen

作为clojure的新手,我使用leiningen创建了一个示例项目

lein new app first-project
Run Code Online (Sandbox Code Playgroud)

这给了我这个目录

.
??? 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
Run Code Online (Sandbox Code Playgroud)

在不修改任何文件的情况下,我可以成功地完成唯一的失败测试

lein test
...
Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
Tests failed.
Run Code Online (Sandbox Code Playgroud)

但是我无法使用运行测试从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}
Run Code Online (Sandbox Code Playgroud)

我试过(但不行)

(require 'first-project.core-test)
Run Code Online (Sandbox Code Playgroud)

Dav*_* J. 61

lein repl,启动REPL ,然后:

(require '[clojure.test :refer [run-tests]])
(require 'your-ns.example-test :reload-all)
(run-tests 'your-ns.example-test)
Run Code Online (Sandbox Code Playgroud)

我更喜欢留在user命名空间中,而不是in-ns另一个答案所提到的那样改变命名空间.相反,将名称空间作为参数传递给run-tests(如上所示).

我也建议远离(use 'clojure.test); 这就是我(require '[clojure.test :refer [run-tests]])上面建议的原因.有关更多背景信息,请阅读http://dev.clojure.org/jira/browse/CLJ-879

  • @JakubM确实,但它需要`:reload-all`:`(要求'incanter.core-tests:reload-all)` (5认同)

Art*_*ldt 16

在上面的示例中,repl位于错误的命名空间中.如果将repl切换到core_test命名空间,它可能会更好.然后跑(run-tests).

(in-ns 'first-project.core-test)
(run-tests)
Run Code Online (Sandbox Code Playgroud)

开发测试的另一种有趣方式是从REPL运行它们直到它们工作,因为测试是带有一些额外元数据的普通函数.

(in-ns 'first-project.core-test)
(my-test)
Run Code Online (Sandbox Code Playgroud)

记住你除了打电话之外还要加载文件in-ns 让我们说你的测试文件是tests/first_project/core_test.clj,然后你需要打电话

(load "tests/first_project/core_test")
(in-ns 'first-project.core-test)
(my-test)
Run Code Online (Sandbox Code Playgroud)

请记住,_在文件系统中成为-命名空间并/成为..

  • 在(in-ns'first-project.core-test)之后,repl不再知道运行测试或require/use函数的名称空间.我试过(clojure.test/run-tests)但它没有找到任何测试(Ran 0测试) (2认同)
  • 这不起作用(运行 Clojure 1.10)。没有找到任何测试。[`require`](https://clojuredocs.org/clojure.core/require) 的方法是有效的。这是因为 [`in-ns`](https://clojuredocs.org/clojure.core/in-ns) 只是为 Clojure 运行时设置“当前命名空间”,但不会从类文件或其他位置加载任何内容实际上填充该名称空间。 (2认同)