Alur kerja pengujian Haskell


101

Saya baru saja memulai proyek Haskell baru dan ingin menyiapkan alur kerja pengujian yang baik dari awal. Sepertinya Haskell memiliki banyak alat pengujian yang sangat baik dan unik serta banyak cara berbeda untuk mengintegrasikannya.

Saya telah memeriksa:

Yang semuanya tampak bekerja sangat baik di domain mereka, tetapi saya mencari pendekatan komprehensif untuk pengujian dan bertanya-tanya apa yang berhasil dengan baik untuk orang lain.

Jawaban:


70

Mendapatkan pengujian unit, cakupan kode, dan tolok ukur yang tepat sebagian besar tentang memilih alat yang tepat.

  • test-framework menyediakan tempat terpadu untuk menjalankan semua kasus pengujian HUnit dan properti QuickCheck Anda, semuanya dari satu harness.
  • Cakupan kode dibangun ke dalam GHC dalam bentuk alat HPC .
  • Kriteria menyediakan beberapa mesin pembandingan yang cukup bagus

Sebagai contoh, saya akan menggunakan paket yang baru saja saya aktifkan dengan pengujian unit, cakupan kode, dan tolok ukur:

http://github.com/ekmett/speculation

Anda dapat mengintegrasikan tes dan benchmark Anda langsung ke file cabal Anda dengan menambahkan bagian untuk mereka, dan menutupinya di belakang bendera sehingga mereka tidak membuatnya sehingga setiap pengguna perpustakaan Anda harus memiliki akses ke (dan ingin menggunakannya sendiri ) versi persis alat pengujian yang Anda pilih.

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

Kemudian, Anda dapat memberi tahu komplotan rahasia tentang cara menjalankan rangkaian pengujian Anda. Karena tes komplotan rahasia belum ada - kami memiliki siswa yang mengerjakannya untuk kode musim panas tahun ini! - mekanisme terbaik yang kita miliki adalah Berikut adalah cara menggunakan mekanisme hook pengguna komplotan rahasia. Ini berarti beralih ke build 'Kustom' dengan komplotan rahasia dan menyiapkan testHook. Contoh testHook yang menjalankan program pengujian yang ditulis dengan test-framework, lalu menerapkan hpc ke profil, dapat ditemukan di sini:

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

Dan kemudian Anda dapat menggunakan kerangka uji untuk menggabungkan pengujian QuickCheck dan HUnit ke dalam satu program:

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

File komplotan rahasia di sana dengan hati-hati mengaktifkan -fhpc untuk mengaktifkan pengujian cakupan kode, dan kemudian testHook di Setup.lhs secara manual menjalankan hpc dan menulis outputnya ke direktori dist Anda.

Untuk benchmarking, ceritanya sedikit lebih manual, tidak ada opsi 'cabal benchmark'. Anda dapat memasukkan benchmark Anda ke dalam test hook, tetapi saya suka menjalankannya secara manual, karena Criterion memiliki begitu banyak opsi pelaporan grafis. Anda dapat menambahkan benchmark Anda ke file cabal seperti yang ditunjukkan di atas, memberi mereka flag kompilasi terpisah, menyembunyikannya di balik flag cabal, dan kemudian menggunakan Criterion untuk melakukan semua tugas berat:

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

Anda kemudian dapat menjalankan benchmark Anda dari baris perintah dan mendapatkan jendela KDE pop-up dengan hasil benchmark, dll.

Karena dalam praktiknya Anda tinggal di komplotan rahasia saat mengembangkan kode Haskell, sangat masuk akal untuk mengintegrasikan toolchain Anda dengannya.

Sunting : Dukungan tes Cabal sekarang sudah ada. Lihat http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
Dan cabal benchsekarang juga ada.
nh2

6
Benar. Saya akan menunjuk ke github.com/ekmett/lens sebagai contoh yang lebih modern tentang bagaimana untuk menangani cabal testdan cabal bench, pencampuran HUnit, doctestdan quickchecktes berbasis dengan criteriontolok ukur. Kode di speculationpredates cabal testdan cabal bench.
Edward KMETT

2
@EdwardKmett: Saya melihat bahwa paket lense hanya menggunakan antarmuka test suite exitcode-stdio-1.0. Panduan pengguna Cabal menyatakan, bahwa `` lebih disukai bahwa rangkaian pengujian baru ditulis untuk antarmuka detail-1.0 ''. Ada komentar tentang itu?
copton

9
@ Cop. Mereka tidak pernah menerapkannya. Dokumentasi itu perlu dibawa kembali dan diambil gambarnya.
Edward KMETT

2
Sayangnya, semua tautan ke github mengarah ke cabang master, dan sepertinya semua yang terkait dengan pengujian telah dihapus dari file komplotan rahasia, sehingga tautan tersebut rusak secara efektif.
Andrew Thaddeus Martin

52

Pendekatan ini dianjurkan di RWH ch 11 dan di XMonad kira-kira:

  • Nyatakan semua properti sistem di QuickCheck
  • Tunjukkan cakupan tes dengan HPC.
  • Konfirmasikan perilaku ruang dengan profil heap .
  • Konfirmasikan perilaku utas / paralel dengan ThreadScope .
  • Konfirmasikan perilaku microbenchmark dengan Criterion .

Setelah invarian utama Anda ditetapkan melalui QuickCheck, Anda dapat mulai memfaktorkan ulang, memindahkan pengujian tersebut ke dalam invarian tipe.

Praktik untuk mendukung upaya Anda:

  • Jalankan regresi QuickCheck yang disederhanakan pada setiap komit.
  • Publikasikan detail cakupan HPC.

14

The paket tes-framework benar-benar mengagumkan. Anda dapat dengan mudah mengintegrasikan pengujian HUnit dan QuickCheck, serta mendapatkan file executable yang menjalankan rangkaian tertentu saja, berdasarkan tanda baris perintah, dengan beberapa target keluaran.

Pengujian dan pembuatan profil adalah binatang yang berbeda. Untuk pembuatan profil, saya akan menyiapkan executable terpisah yang menekankan hanya bagian yang ingin Anda buat profil, dan hanya melihat dengan cermat hasil pembuatan dan pelaksanaan pembuatan profil (dengan -prof-auto-all untuk kompilasi dan + RTS -p untuk runtime bendera).


Penerus yang lebih aktif dipelihara untuk kerangka uji sangat enak .
sjakobi

10

Untuk pengujian, saya mengandalkan properti HUnit dan QuickCheck dan menggunakan Kerangka Uji Haskell untuk mengumpulkan semua pengujian unit dan semua properti QuickCheck secara otomatis.

Penafian: Saya adalah pengembang utama Kerangka Uji Haskell.


5
Stefan, dokumentasi tentang ini sangat sedikit. Saya kira itulah alasan utama untuk tetap tidak populer. Ada pertanyaan di sini yang patut Anda perhatikan: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov

2
Rilis baru HTF 0.9.0.0 sekarang hadir dengan cukup banyak dokumentasi. Selain itu, saya memindahkan pengembangan ke github.com/skogsbaer/HTF . Saya berharap ini akan memudahkan orang untuk menggunakan HTF dan untuk bertanya tentang HTF. Jangan ragu untuk melakukannya!
Stefanwehr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.