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

时间:2013-07-26 22:13:09

标签: testing clojure

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

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

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

user=>(rt)

这对我来说效果不错。当我删除测试时,我必须重新启动REPL并重新定义有点烦人的方法。另外,我听到过关于使用use这样的use函数的错误信息。所以我的问题是:

  • 使用{{1}}这样会导致我遇到问题吗?
  • 是否有比我目前正在做的更惯用的工作流程?

3 个答案:

答案 0 :(得分:17)

大多数人都跑

lein test

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

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

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:6)

我对lein-midje

印象深刻

$ lein midje :autotest

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