2013-07-26 18 views
14

Hiện nay, tôi xác định các chức năng sau đây trong REPL vào lúc bắt đầu của một phiên mã hóa:Các 'đúng' cách để chạy thử nghiệm đơn vị trong Clojure

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

Và mỗi khi thực hiện thay đổi tôi chạy lại kiểm tra:

user=>(rt) 

Điều đó hoạt động tốt với tôi. Khi tôi loại bỏ một bài kiểm tra, tôi phải khởi động lại REPL và xác định lại phương thức gây khó chịu một chút. Ngoài ra tôi đã nghe nói xấu rumblings về việc sử dụng các chức năng use như thế này. Vì vậy, câu hỏi của tôi là:

  • Đang sử dụng use cách này sẽ khiến tôi gặp trục trặc?
  • Có quy trình làm việc thành ngữ hơn những gì tôi đang làm không?

Trả lời

9

Tôi cũng chạy thử nghiệm trong REPL của mình. Tôi thích làm điều này bởi vì tôi có nhiều quyền kiểm soát hơn đối với các thử nghiệm và nó nhanh hơn do JVM đã chạy. Tuy nhiên, như bạn đã nói, thật dễ dàng để gặp rắc rối. Để làm sạch mọi thứ, tôi khuyên bạn nên xem tools.namespace.

Cụ thể, bạn có thể sử dụng clojure.tools.namespace.repl/refresh để tải lại các tệp đã thay đổi trong REPL trực tiếp của bạn. Ngoài ra còn có refresh-all để tải lại tất cả các tệp trên đường dẫn lớp.

Tôi thêm công cụ.namespace vào hồ sơ :dev của tôi trong số ~/.lein/profiles.clj để tôi có nó ở đó cho mọi dự án. Sau đó, khi bạn chạy lein repl, nó sẽ được bao gồm trên classpath, nhưng nó sẽ không bị rò rỉ vào phụ thuộc thích hợp của dự án của bạn.

Một việc khác tôi sẽ làm khi tôi đang làm bài kiểm tra là yêu cầu nó vào REPL và chạy thủ công. Thử nghiệm chỉ là một hàm không có đối số, vì vậy bạn có thể gọi chúng như vậy.

+0

+1 để chỉ ra các bài kiểm tra chỉ là các hàm không có hàm số 0 – liwp

16

hầu hết mọi người chạy

lein test 

dạng một thiết bị đầu cuối khác nhau. Mà đảm bảo rằng những gì có trong các tập tin là những gì được kiểm tra không phải là những gì có trong bộ nhớ của bạn. Sử dụng reload-all có thể dẫn đến thông báo sai nếu bạn đã thay đổi tên hàm và vẫn gọi tên cũ ở đâu đó.

  • gọi số use như vậy không phải là vấn đề trong chính bản thân nó, nó chỉ hạn chế bạn không có bất kỳ xung đột tên nào nếu bạn sử dụng nhiều không gian tên trong thử nghiệm của mình. Vì vậy, miễn là bạn có một, nó là ok.
  • sử dụng lein cho phép bạn chỉ định đơn vị và integration tests và dễ dàng chạy chúng theo nhóm bằng tính năng bộ chọn thử nghiệm.
+4

Tôi bắt đầu chạy thử nghiệm với 'lein test' nhưng các thử nghiệm mất nhiều thời gian hơn để chạy khi so sánh với chạy chúng trong REPL. Điều đó được mong đợi hay tôi đang làm sai? –

+1

[clojure.test] (https://github.com/jakemcc/lein-test-refresh), [mong đợi] (https://github.com/jakemcc/lein-autoexpect), speclj và midje tất cả hỗ trợ xem thay đổi tệp và tự động chạy các thử nghiệm (nhanh chóng trừ lần tải đầu tiên) .Nếu bạn đang sử dụng các emacs, [cider] (https://github.com/clojure-emacs/cider#upgrading-from-clojure-test-mode) có chế độ kiểm tra clojure chạy thử nghiệm trong các emacs trên đầu repl, điều này khá thú vị – xhh

5

Tôi rất ấn tượng với xa lein-midje

$ lein midje :autotest

Bắt đầu một quá trình clojure xem src và kiểm tra file, tải lại các không gian tên có liên quan và chạy các bài kiểm tra liên quan đến các tập tin thay đổi (phụ thuộc theo dõi). Tôi sử dụng nó với VimShell để mở một bộ đệm chia trong vim và có cả các nguồn và các tập tin thử nghiệm mở là tốt. Tôi viết một thay đổi cho một trong hai và các bài kiểm tra (có liên quan) được thực hiện trong ngăn phân chia.