2013-07-26 8 views
14

現在、私はコーディングセッションの開始時にREPLに次の関数を定義します。のClojureでユニットテストを実行するための「正しい」方法

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

そして毎回、私は私がテストを再実行して変更を行います。

user=>(rt) 

これは私にとっては適度にうまくいっています。テストを削除すると、REPLを再起動して、少し面倒なメソッドを再定義する必要があります。また、私はこのようなuse機能を使用することについて悪い噂が聞こえました。だから私の質問は次のとおりです

  • この方法では私が問題を引き起こしてしまいます。
  • 私は現在行っている作業よりも慣れ親しんだワークフローがありますか?

答えて

9

また、私のREPLでテストを実行します。テストをより詳細に制御できるため、JVMがすでに実行されているため、テストがより高速になります。しかし、あなたが言ったように、困ってしまうのは簡単です。物事をきれいにするために、私はtools.namespaceを見てみることをお勧めします。

具体的には、clojure.tools.namespace.repl/refreshを使用して、実際のREPLで変更されたファイルをリロードすることができます。クラスパス上のすべてのファイルをリロードするためのrefresh-allもあります。

私は~/.lein/profiles.clj:devのプロフィールにtools.namespaceを追加し、すべてのプロジェクトにtools.namespaceを追加しました。 lein replを実行すると、それはクラスパスに含まれますが、プロジェクトの適切な依存関係に漏れません。

私がテストをしているときにもう一度やることは、それを自分のREPLに要求して手動で実行することです。テストは単なる引数のない関数なので、そのように呼び出すことができます。

+0

+1はテストがゼロアリティ関数 – liwp

16

ほとんどの人が

lein test 

を実行する別の端末を形成します。これは、ファイルに含まれるものが、あなたの記憶にあるものではなく、テストされているものであることを保証します。 reload-allを使用すると、関数名を変更しても古い名前をどこかで呼び出している場合に、誤ったパスが発生する可能性があります。それはそれの自己では問題ではありませんようuseを呼び出す

  • 、それはちょうどあなたがあなたのテストでより多くの名前空間を使用している場合は任意の名前の衝突を持っていないためにあなたを制約します。あなたが持っている限り、それは大丈夫です。
  • leinを使用すると、ユニットとintegration testsを指定し、テストセレクタ機能を使用してグループ単位で簡単に実行できます。
+4

私は 'レインのtest'でテストを実行して始まったが、テストはREPLでそれらを実行していると比較すると、ときに実行するためにそんなに長い時間がかかります。それが期待されているのですか、それとも間違っていますか? –

+1

[clojure.test(https://github.com/jakemcc/lein-test-refresh)、[期待](https://github.com/jakemcc/lein-autoexpect)、speclj、及び監視すべてのサポートをmidje Emacsを使っている.IF(最初のロード以外に高速である)ファイルが変更され、自動的にテストを実行し、[サイダー](https://github.com/clojure-emacs/cider#upgrading-from-clojure-test-mode )は、replの上でemacsでテストを実行するclojure-test-modeを持っています。これはかなりクールです。 – xhh

5

私はこれまでlein-midje

$ lein midje :autotest

、srcとテストファイルを見てClojureのプロセスを開始し、関連する名前空間をリロードし、変更されたファイル(追跡依存関係)に関連したテストを実行するに感銘を受けています。私はvimShellでsplitバッファを開き、ソースファイルとテストファイルの両方を開いています。私はどちらかに変更を書き、(関連する)テストは分割ペインで実行されます。

関連する問題