16

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

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

每次我进行更改时,我都会重新运行测试:

user=>(rt)

这对我来说效果适中。当我删除一个测试时,我必须重新启动 REPL 并重新定义方法,这有点烦人。我也听说过关于使用这样的use功能的坏消息。所以我的问题是:

  • 使用use这种方式会给我带来麻烦吗?
  • 有比我目前正在做的更惯用的工作流程吗?
4

3 回答 3

18

大多数人跑步

lein test

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

  • 这样调用use本身不是问题,如果您在测试中使用更多命名空间,它只会限制您没有任何名称冲突。只要你有一个,没关系。
  • 使用 lein 可以指定单元和集成测试,并使用测试选择器功能轻松地在组中运行它们。
于 2013-07-27T00:57:52.953 回答
12

我还在我的 REPL 中运行测试。我喜欢这样做,因为我对测试有更多的控制权,而且由于 JVM 已经在运行,所以速度更快。但是,就像你说的那样,很容易陷入困境。为了清理干净,我建议看一下tools.namespace

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

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

当我进行测试时,我会做的另一件事是要求它进入我的 REPL 并手动运行它。测试只是一个无参数函数,因此您可以这样调用它们。

于 2013-07-27T04:14:59.953 回答
7

到目前为止,我对lein-midje印象深刻

$ lein midje :autotest

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

于 2014-01-09T09:46:18.163 回答