2011-01-14 29 views
24

Vì vậy, tôi đang cố gắng theo dõi suggested structure of a Haskell project và tôi đang gặp một số sự cố khi tổ chức các thử nghiệm của mình.Tổ chức thử nghiệm Haskell

Để đơn giản, hãy bắt đầu với:

src/Clue/Cards.hs # defines Clue.Cards module 
testsuite/tests/Clue/Cards.hs # tests Clue.Cards module 

Thứ nhất, tôi không chắc chắn những gì để đặt tên cho mô-đun trong testsuite/tests/Clue/Cards.hs có chứa mã kiểm tra, và cho người khác, tôi không chắc chắn làm thế nào để biên dịch mã thử nghiệm của tôi để tôi có thể liên kết đến nguồn của tôi:

% ghc -c testsuite/tests/Clue/Cards.hs -L src 
testsuite/tests/Clue/Cards.hs:5:0: 
    Failed to load interface for `Clue.Cards': 
     Use -v to see a list of the files searched for. 

Trả lời

26

tôi sử dụng bản thân mình cách tiếp cận bởi Snap Framework cho việc test suites của họ, mà về cơ bản nắm tới:

  1. Dùng thử khuôn khổ như haskell-test-framework hoặc HTF
  2. Tên các module chứa các bài kiểm tra bằng thêm .Tests vào tên mô-đun có chứa IUT, ví dụ:

    module Clue.Cards where ... -- module containing IUT 
    
    module Clue.Cards.Tests where ... -- module containing tests for IUT 
    
  3. Bằng cách sử dụng các không gian tên riêng biệt, bạn có thể đặt thử nghiệm trong một thư mục nguồn riêng biệt tests/, sau đó bạn có thể sử dụng một mục tiêu xây dựng Cabal riêng biệt (xem thêm cabal test -build-target hỗ trợ trong các phiên bản Cabal gần đây) cho bộ thử nghiệm bao gồm thư mục nguồn bổ sung trong nó hs-source-dirs cài đặt, ví dụ:

    Executable clue 
        hs-source-dirs: src 
        ... 
    
    Executable clue-testsuite 
        hs-source-dirs: src tests 
        ... 
    

    này hoạt động, vì không có va chạm namespace giữa các module trong IUT của bạn và kiểm tra-suite nữa.

+1

+1 để đề cập đến khung công tác nhanh, được tổ chức cực kỳ tốt trong lĩnh vực này. –

+0

Tuyệt. Tôi đang sử dụng dự án này như một cách để tìm hiểu hệ sinh thái Haskell (Tôi không nghĩ rằng ai đó bị ngứa để thực hiện các quy tắc của Clue/Cluedo), và tôi vẫn chưa giải quyết được cabal, vì vậy đây là một cú đá tốt quần. Tôi sẽ tìm ra cách sử dụng cabal, sau đó khoanh tròn lại để kiểm tra. – rampion

+1

cũng đáng chú ý về dự án khung công tác: họ có các bộ thử nghiệm tích hợp với hudson, xuất bản các kết quả kiểm tra và báo cáo bảo hiểm (xem http://buildbot.snapframework.com/) – hvr

3

Cá nhân tôi cảm thấy rằng một phụ ./src/ thư mục không có ý nghĩa nhiều cho các dự án Haskell nhỏ. Của thô có nguồn, tôi đã tải về mã nguồn.

Dù bằng cách nào (có hoặc không src), tôi muốn đề nghị bạn Refactor và có một thư mục ClueTest thư mục:

./Clue/Cards.hs -- module Clude.Cards where ... 
./Test/Cards.hs -- module Test.Cards where ... 

này cho phép GHCi + Test.Cards để xem Clue.Cards mà không cần bất kỳ thêm args hoặc sử dụng cabal. Trên lưu ý đó, nếu bạn không sử dụng cabal + flags để tùy chọn xây dựng các mô-đun thử nghiệm của bạn thì bạn nên xem xét nó.

Một tùy chọn khác, mà tôi sử dụng trong nhiều dự án của tôi, là phải có:

./Some/Module/Hierarchy/File.hs 
./tests/someTests.hs 

Và tôi cabal install gói sau đó chạy những thứ tests/someTests.hs. Tôi đoán điều này sẽ gây phiền nhiễu nếu các gói của tôi đặc biệt lớn và quá lâu để cài đặt.

+4

Tôi nghĩ thư mục 'src' bổ sung luôn hợp lý vì nó đủ điều kiện thực sự nằm trong phân cấp mã nguồn: Nguồn Haskell! Điều này đặc biệt hữu ích khi ứng dụng của bạn có những thứ khác nằm trong đó, chẳng hạn như tập lệnh, tệp cấu hình và các nguồn không phải Haskell khác. – fatuhoku

3

Dưới đây là một cách khác:

kiểm tra đơn vị của mỗi mô-đun được định nghĩa là một hunit TestList at the end of the module, với một số sơ đồ đặt tên phù hợp, chẳng hạn như "tests_Path_To_Module". Tôi nghĩ rằng điều này giúp tôi viết các bài kiểm tra, vì tôi không phải tìm kiếm một mô-đun khác ở xa trong cây nguồn, cũng như không giữ hai hệ thống phân cấp tệp song song đồng bộ.

Danh sách kiểm tra của mô-đun cũng bao gồm các thử nghiệm của bất kỳ mô-đun phụ nào.Vận động viên runTESTTT của Hunit được tích hợp vào ứng dụng và có thể truy cập qua test command. Điều này có nghĩa là người dùng có thể chạy thử nghiệm bất kỳ lúc nào mà không cần thiết lập đặc biệt. Hoặc nếu bạn không thích kiểm tra vận chuyển trong ứng dụng sản xuất, hãy sử dụng CPP và cờ cabal để bao gồm chúng chỉ trong các bản dựng của nhà phát triển hoặc trong một trình chạy thử nghiệm riêng biệt.

Ngoài ra còn có các thử nghiệm chức năng, một hoặc nhiều tệp trong thư mục tests/, chạy với shelltestrunner và một số thử nghiệm liên quan đến quá trình dev có trong Makefile.

+3

Tôi không khuyên bạn nên đặt các thử nghiệm trong các mô-đun triển khai của mình. Bạn sẽ có thể biên dịch các mô đun sản xuất của mình mà không phụ thuộc vào khung kiểm tra. (_xUnit Patterns_ gọi mùi này là "Kiểm tra phụ thuộc trong sản xuất"). Sử dụng cờ CPP để giải thoát chúng không phải là giải pháp thực sự. Trong bất kỳ trường hợp nào, nó sẽ phá vỡ Nguyên tắc chịu trách nhiệm duy nhất. –

1

Vì lợi ích đầy đủ, nên đề cập đến một cách tiếp cận rất dễ dàng cho dự án nhỏ thông qua ghci -i. Ví dụ: trong trường hợp của bạn,

>ghci -isrc:testsuite 
ghci>:l Clue.Cards 
ghci>:l tests.Clue.Cards 
Các vấn đề liên quan