Quy trình kiểm tra Haskell


101

Tôi vừa bắt đầu một dự án Haskell mới và muốn thiết lập một quy trình kiểm tra tốt ngay từ đầu. Có vẻ như Haskell có rất nhiều công cụ kiểm tra tuyệt vời và độc đáo và nhiều cách khác nhau để tích hợp chúng.

Tôi đã xem xét:

Tất cả đều có vẻ hoạt động rất tốt trong các miền của chúng, nhưng tôi đang tìm kiếm một cách tiếp cận toàn diện để kiểm tra và đang tự hỏi điều gì đã hoạt động tốt cho những người khác.

Câu trả lời:


70

Việc kiểm tra đơn vị, phạm vi mã và điểm chuẩn phù hợp chủ yếu là chọn đúng công cụ.

  • test-framework cung cấp một điểm duy nhất để chạy tất cả các trường hợp thử nghiệm HUnit và thuộc tính QuickCheck của bạn tất cả từ một bộ khai thác.
  • Phạm vi của mã được tích hợp vào GHC dưới dạng công cụ HPC .
  • Criterion cung cấp một số máy đo điểm chuẩn khá tuyệt vời

Tôi sẽ sử dụng như một ví dụ đang chạy, một gói mà tôi vừa mới bắt đầu kích hoạt với thử nghiệm đơn vị, phạm vi mã và điểm chuẩn:

http://github.com/ekmett/speculation

Bạn có thể tích hợp các bài kiểm tra và điểm chuẩn trực tiếp vào tệp cabal của mình bằng cách thêm các phần cho chúng và che chúng đằng sau các cờ để chúng không xuất hiện để mọi người dùng trong thư viện của bạn phải có quyền truy cập (và muốn sử dụng cho chính họ ) phiên bản chính xác của các công cụ kiểm tra bạn đã chọn.

http://github.com/ekmett/speculation/blob/master/speculation.cabal

Sau đó, bạn có thể nói với cabal về cách chạy bộ thử nghiệm của mình. Vì bài kiểm tra cabal chưa tồn tại - chúng tôi có một sinh viên đang làm bài kiểm tra đó cho mùa hè năm nay về mã! - cơ chế tốt nhất mà chúng tôi có Đây là cách sử dụng cơ chế móc người dùng của cabal. Điều này có nghĩa là chuyển sang bản dựng 'Custom' với cabal và thiết lập testHook. Bạn có thể tìm thấy ví dụ về testHook chạy chương trình thử nghiệm được viết bằng test-framework, sau đó áp dụng hpc vào cấu hình của nó:

http://github.com/ekmett/speculation/blob/master/Setup.lhs

Và sau đó, bạn có thể sử dụng khung thử nghiệm để gói các thử nghiệm QuickCheck và HUnit vào một chương trình:

http://github.com/ekmett/speculation/blob/master/Test.hs

Tệp cabal ở đó hãy cẩn thận bật -fhpc để kích hoạt kiểm tra độ phủ mã, và sau đó testHook trong Setup.lhs chạy hpc theo cách thủ công và ghi đầu ra của nó vào dir dist của bạn.

Đối với điểm chuẩn, câu chuyện là thủ công hơn một chút, không có tùy chọn 'điểm chuẩn cabal'. Bạn có thể chuyển các điểm chuẩn vào móc thử nghiệm của mình, nhưng tôi thích chạy chúng bằng tay, vì Criterion có rất nhiều tùy chọn báo cáo đồ họa. Bạn có thể thêm điểm chuẩn của mình vào tệp cabal như được hiển thị ở trên, cung cấp cho chúng các cờ biên dịch riêng biệt, ẩn chúng sau một cờ cabal và sau đó sử dụng Criterion để thực hiện tất cả các công việc nặng nhọc:

http://github.com/ekmett/speculation/blob/master/Benchmark.hs

Sau đó, bạn có thể chạy điểm chuẩn của mình từ dòng lệnh và nhận cửa sổ KDE bật lên với kết quả điểm chuẩn, v.v.

Vì trong thực tế, bạn vẫn đang sống ở cabal trong khi phát triển mã Haskell, nên việc tích hợp chuỗi công cụ của bạn với nó là rất hợp lý.

Chỉnh sửa : Hỗ trợ thử nghiệm Cabal hiện đã tồn tại. Xem http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
cabal benchbây giờ cũng tồn tại.
nh2 27/10/12

6
Thật. Tôi sẽ trỏ đến github.com/ekmett/lens như một ví dụ hiện đại hơn như thế nào để đối phó với cabal testcabal bench, pha trộn HUnit, doctestquickcheckkiểm tra dựa trên với criterionđiểm chuẩn. Mã ở vị speculationtừ cabal testcabal bench.
Edward KMETT

2
@EdwardKmett: Tôi thấy rằng gói lense chỉ sử dụng giao diện bộ thử nghiệm exitcode-stdio-1.0. Hướng dẫn sử dụng Cabal nói rằng `` ưu tiên các bộ thử nghiệm mới được viết cho giao diện chi tiết-1.0 ''. Bất kỳ ý kiến ​​về điều đó?
copton 29/12/12

9
@copton Họ không bao giờ triển khai nó. Tài liệu đó cần được lấy ra và quay lại.
Edward KMETT

2
Thật không may, các liên kết đến github đều trỏ đến nhánh chính và có vẻ như mọi thứ liên quan đến thử nghiệm đã bị xóa khỏi tệp cabal, vì vậy các liên kết bị hỏng một cách hiệu quả.
Andrew Thaddeus Martin

52

Cách tiếp cận được ủng hộ trong RWH ch 11 và trong XMonad là khoảng:

  • Nêu tất cả các thuộc tính của hệ thống trong QuickCheck
  • Hiển thị phạm vi kiểm tra với HPC.
  • Xác nhận hành vi không gian với cấu hình đống .
  • Xác nhận hành vi luồng / song song với ThreadScope .
  • Xác nhận hành vi của microbenchmark với Tiêu chí .

Khi các bất biến chính của bạn được thiết lập thông qua QuickCheck, bạn có thể bắt đầu cấu trúc lại, chuyển các kiểm tra đó thành các bất biến kiểu.

Các phương pháp hỗ trợ nỗ lực của bạn:

  • Chạy hồi quy QuickCheck đơn giản hóa trên mọi cam kết.
  • Xuất bản chi tiết về phạm vi bảo hiểm của HPC.

14

Các gói thử nghiệm-framework là thực sự tuyệt vời. Bạn có thể dễ dàng tích hợp các bài kiểm tra HUnit và QuickCheck cũng như nhận các tệp thực thi chỉ chạy các bộ được chỉ định, dựa trên cờ dòng lệnh, với nhiều mục tiêu đầu ra.

Tuy nhiên, kiểm tra và lập hồ sơ là những con thú khác nhau. Để lập hồ sơ, tôi sẽ thiết lập một tệp thực thi riêng chỉ nhấn mạnh vào phần bạn muốn lập hồ sơ và chỉ cần xem xét cẩn thận kết quả của các bản dựng và chạy cấu hình (với -prof-auto-all để biên dịch và + RTS -p cho thời gian chạy cờ).


Một kế hơn tích cực duy trì để kiểm tra-framework là ngon .
sjakobi

10

Để kiểm tra, tôi dựa vào thuộc tính HUnit và QuickCheck và sử dụng Khung kiểm tra Haskell để tự động thu thập tất cả các bài kiểm tra đơn vị và tất cả các thuộc tính QuickCheck.

Tuyên bố từ chối trách nhiệm: Tôi là nhà phát triển chính của Khung kiểm tra Haskell.


5
Stefan, có quá ít tài liệu về điều này. Tôi đoán đó là lý do chính để nó không được ưa chuộng. Có một câu hỏi ở đây chắc chắn đáng để bạn chú ý: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov,

2
Bản phát hành mới 0.9.0.0 của HTF hiện đi kèm với khá nhiều tài liệu. Ngoài ra, tôi đã chuyển phát triển sang github.com/skogsbaer/HTF . Tôi hy vọng điều này sẽ giúp mọi người sử dụng HTF dễ dàng hơn và đặt câu hỏi về HTF. Cảm thấy tự do để làm như vậy!
stefanwehr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.