Haskell testi iş akışı


101

Yeni bir Haskell projesine yeni başladım ve en başından itibaren iyi bir test iş akışı oluşturmak istedim. Haskell'in pek çok mükemmel ve benzersiz test aracı ve bunları entegre etmenin birçok farklı yolu var gibi görünüyor.

Baktım:

Bunların hepsi kendi alanlarında çok iyi çalışıyor gibi görünüyor, ancak test etmek için kapsamlı bir yaklaşım arıyorum ve diğer insanlar için neyin işe yaradığını merak ediyordum.

Yanıtlar:


70

Birim testi, kod kapsamı ve karşılaştırmaları doğru yapmak çoğunlukla doğru araçları seçmekle ilgilidir.

  • test çerçevesi, tüm HUnit test durumlarınızı ve QuickCheck özelliklerinizi tek bir kablo demetinden çalıştırmak için tek noktadan bir mağaza sağlar .
  • Kod kapsamı, HPC aracı biçiminde GHC'ye yerleştirilmiştir .
  • Criterion, oldukça iyi kıyaslama makineleri sağlar

Çalışan bir örnek olarak, birim testi, kod kapsamı ve kıyaslamalar ile etkinleştirmeye yeni başladığım bir paketi kullanacağım:

http://github.com/ekmett/speculation

Testlerinizi ve karşılaştırmalı değerlendirmelerinizi, bunlar için bölümler ekleyerek ve bunları bayrakların arkasına maskeleyerek doğrudan cabal dosyanıza entegre edebilirsiniz, böylece kütüphanenizdeki her kullanıcının erişebilmesi (ve kendileri için kullanmak istemesi) ) seçtiğiniz test araçlarının tam sürümü.

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

Ardından, Cabal'a test süitinizi nasıl çalıştıracağınızı anlatabilirsiniz. Cabal testi henüz mevcut olmadığından - bu yılki kod yazında üzerinde çalışan bir öğrencimiz var! - Elimizdeki en iyi mekanizma İşte cabal'ın kullanıcı kanca mekanizmasının nasıl kullanılacağı. Bu, cabal ile 'Özel' bir yapıya geçmek ve bir testHook kurmak anlamına gelir. Test çerçevesi ile yazılmış bir test programını çalıştıran ve ardından hpc'yi profile uygulayan bir testHook örneği burada bulunabilir:

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

Ardından, QuickCheck ve HUnit testlerini tek bir programda toplamak için test çerçevesini kullanabilirsiniz:

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

Buradaki cabal dosyası, kod kapsamı testini etkinleştirmek için -fhpc'yi açmaya dikkat eder ve ardından Setup.lhs'deki testHook hpc'yi manuel olarak çalıştırır ve çıktısını dist dizine yazar.

Kıyaslama için hikaye biraz daha manueldir, 'kabal kıyaslama' seçeneği yoktur. Kriterlerinizi test kancanıza bağlayabilirsiniz, ancak Criterion çok sayıda grafik raporlama seçeneğine sahip olduğu için bunları elle çalıştırmayı seviyorum. Karşılaştırmalarınızı yukarıda gösterildiği gibi cabal dosyasına ekleyebilir, onlara ayrı derleme bayrakları verebilir, onları bir cabal bayrağının arkasına gizleyebilir ve ardından tüm ağır işleri yapmak için Kriter'i kullanabilirsiniz:

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

Daha sonra karşılaştırmalarınızı komut satırından çalıştırabilir ve karşılaştırma sonuçlarını içeren açılır KDE pencereleri vb. Alabilirsiniz.

Pratikte Haskell kodunu geliştirirken yine de cabal'da yaşadığınız için, araç zincirinizi onunla entegre etmek çok mantıklı.

Düzenleme : Cabal testi desteği artık var. Bkz. Http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
Ve cabal benchşimdi de var.
nh2

6
Doğru. Ben işaret ediyorum github.com/ekmett/lens nasıl başa bir daha modern bir örnek olarak cabal testve cabal benchkarıştırma, HUnit, doctest, ve quickcheckesaslı testler criterionkriterler. Kod speculationeskidir cabal testve cabal bench.
Edward KMETT

2
@EdwardKmett: Lens paketinin sadece exitcode-stdio-1.0 test paketi arayüzünü kullandığını gördüm. Cabal kullanıcı kılavuzunda `` detaylı-1.0 arayüzü için yeni test süitlerinin yazılması tercih edilir '' belirtmektedir. Bununla ilgili herhangi bir yorum var mı?
copton

9
@copton Hiç uygulamadılar. Bu belgelerin geri alınması ve vurulması gerekiyor.
Edward KMETT

2
Ne yazık ki, github bağlantılarının tümü ana dalı işaret ediyordu ve testle ilgili her şey cabal dosyasından kaldırılmış gibi görünüyor, bu nedenle bağlantılar etkili bir şekilde kesildi.
Andrew Thaddeus Martin

52

Yaklaşım, RWH ch 11'de savunucudur ve XMonad'da yaklaşık olarak:

QuickCheck aracılığıyla ana değişmezleriniz belirlendikten sonra, yeniden düzenlemeye başlayabilir, bu testleri tür değişmezlerine taşıyabilirsiniz.

Çabalarınızı destekleyecek uygulamalar:

  • Her işlemede basitleştirilmiş bir QuickCheck regresyonu çalıştırın.
  • HPC kapsam ayrıntılarını yayınlayın.

14

Test-çerçeve paketi gerçekten harika. HUnit ve QuickCheck testlerini kolayca entegre edebilir ve birden çok çıktı hedefiyle komut satırı bayraklarına dayalı olarak yalnızca belirli paketleri çalıştıran yürütülebilir dosyalar elde edebilirsiniz.

Yine de test etme ve profil oluşturma farklı canavarlardır. Profil oluşturma için, yalnızca profillemek istediğiniz bölümü vurgulayan ve yalnızca profil oluşturma derlemelerinin ve çalıştırmalarının sonuçlarına dikkatlice bakarak (derleme için -prof-auto-all ve bir çalışma zamanı için + RTS -p ile) ayrı bir yürütülebilir dosya oluşturdum. bayrak).


Test çerçevesinin daha aktif olarak sürdürülen halefi lezzetlidir .
sjakobi

10

Test için HUnit ve QuickCheck özelliklerine güveniyorum ve tüm birim testlerini ve tüm QuickCheck özelliklerini otomatik olarak toplamak için Haskell Test Çerçevesini kullanıyorum.

Sorumluluk reddi: Haskell Test Framework'ün ana geliştiricisiyim.


5
Stefan, bununla ilgili çok az belge var. Sanırım popüler kalmamasının birincil nedeni bu. Burada kesinlikle dikkatinize değer bir soru var: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov

2
HTF'nin yeni sürümü 0.9.0.0 şimdi oldukça fazla belge ile birlikte geliyor. Ayrıca geliştirmeyi github.com/skogsbaer/HTF adresine taşıdım . Umarım bu, insanların HTF'yi kullanmasını ve HTF hakkında soru sormasını kolaylaştırır. Bunu yapmaktan çekinmeyin!
stefanwehr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.