2013-07-26 77 views
14

目前,我定義的REPL下面的函數在編碼會話的開始:「正確」的方式來Clojure中運行單元測試

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

每次我做出改變我重新運行測試:

user=>(rt) 

這對我來說工作適度。當我刪除測試時,我必須重新啓動REPL並重新定義有點煩人的方法。我也聽說過使用這種use函數的不好的謠言。所以我的問題是:

  • 正在使用use這種方式會導致我的問題?
  • 有沒有比我現在做的更習慣的工作流程?

回答

9

我也在我的REPL中運行測試。我喜歡這樣做,因爲我可以更好地控制測試,並且由於JVM已經運行,所以速度更快。但是,就像你說的那樣,很容易陷入困境。爲了清理乾淨,我建議看看tools.namespace

特別是,您可以使用clojure.tools.namespace.repl/refresh重新加載在您的實時REPL中已更改的文件。還有refresh-all重新加載類路徑中的所有文件。

我將我的:dev配置文件中的tools.namespace添加到我的~/.lein/profiles.clj中,這樣我就可以在每個項目中使用它。然後,當您運行lein repl時,它將包含在類路徑中,但它不會泄漏到您項目的適當依賴項中。

當我正在進行測試時,我會做的另一件事是將其放入我的REPL並手動運行。測試只是一個無參數函數,所以你可以像這樣調用它們。

+0

+1指出測試只是零元函數 – liwp

16

大多數人跑

lein test 

形式不同的終端。它保證文件中的內容是被測試的內容,而不是內存中的內容。使用reload-all可能會導致錯誤通過,如果您已更改函數名稱並仍在某處調用舊名稱。

  • 調用use一樣,是沒有問題的,在它的自我,它只是限制你沒有任何名稱衝突,如果你在測試中使用多個命名空間。只要你有一個,沒關係。
  • 使用lein可讓您指定單位和integration tests,並使用測試選擇器功能可以輕鬆地按組運行它們。
+4

我開始使用'lein test'運行測試,但與在REPL中運行測試相比,測試需要很長時間才能運行。這是預期的還是我做錯了? –

+1

[clojure.test](https://github.com/jakemcc/lein-test-refresh),[期望](https://github.com/jakemcc/lein-autoexpect),speclj和midje都支持觀看文件更改並自動運行測試(除第一次加載外,速度很快)。如果您使用的是emacs,[蘋果酒](https://github.com/clojure-emacs/cider#upgrading-from-clojure-test-mode )有一個clojure測試模式,它在repl之上的emacs上運行測試,這是非常酷的 – xhh

5

我與lein-midje

$ lein midje :autotest

至今印象深刻啓動一個Clojure的過程看src和測試文件,重新加載相關的命名空間,並運行相關的更改的文件(跟蹤依賴)的測試。我在VimShell中使用它來在vim中打開分割緩衝區,同時打開源文件和測試文件。我向其中一個寫入更改,並且(相關)測試在分割窗格中執行。

相關問題