在Clojure中运行单元测试的"正确"方法

Gar*_*owe 16 testing clojure

目前,我在编码会话开始时在REPL中定义了以下函数:

(defn rt []
  (let [tns 'my.namespace-test]
    (use tns :reload-all)
    (cojure.test/test-ns tns)))
Run Code Online (Sandbox Code Playgroud)

每当我做出改变时,我都会重新运行测试:

user=>(rt)
Run Code Online (Sandbox Code Playgroud)

那对我来说工作得很好.当我删除测试时,我必须重新启动REPL并重新定义有点烦人的方法.我也听说过使用这个use功能的不好的谣言.所以我的问题是:

  • 使用use这种方式会导致我的问题吗?
  • 是否有比我目前正在做的更惯用的工作流程?

Art*_*ldt 17

大多数人跑

lein test
Run Code Online (Sandbox Code Playgroud)

形成一个不同的终端.这保证了文件中的内容是经过测试而不是内存中的内容.reload-all如果您更改了函数名称并且仍在某处调用旧名称,则使用可能会导致错误传递.

  • 这样调用use并不是它自身的问题,如果你在测试中使用更多的命名空间,它只会限制你没有任何名称冲突.只要你有一个,没关系.
  • 使用lein可以指定单元和集成测试,并使用测试选择器功能轻松地在组中运行它们.

  • 我开始使用`lein test`运行测试,但与在REPL中运行它们相比,测试需要花费更长的时间才能运行.这是预期还是我做错了? (4认同)

Jer*_*emy 10

我也在我的REPL中运行测试.我喜欢这样做,因为我可以更好地控制测试,并且由于JVM已经运行,因此速度更快.但是,就像你说的那样,很容易遇到麻烦.为了清理,我建议看一下tools.namespace.

特别是,您可以使用clojure.tools.namespace.repl/refresh重新加载实时REPL中已更改的文件.还有refresh-all重新加载类路径上的所有文件.

我将tools.namespace添加到我的:dev个人资料中,~/.lein/profiles.clj以便我可以在每个项目中使用它.然后当你运行时lein repl,它将被包含在类路径中,但它不会泄漏到你的项目的正确依赖项中.

我在进行测试时要做的另一件事是将它放入我的REPL并手动运行.测试只是一个无参数函数,所以你可以这样调用它们.


Bla*_*ler 6

lein-midje给我留下了深刻的印象

$ lein midje :autotest

启动查看src和测试文件的clojure进程,重新加载关联的命名空间并运行与更改的文件相关的测试(跟踪依赖项).我在VimShell中使用它在vim中打开一个拆分缓冲区,同时打开源文件和测试文件.我将更改写入其中一个,并在拆分窗格中执行(相关)测试.