Haskell testing workflow

Właśnie zacząłem nowy projekt Haskell i od początku chciałem stworzyć dobry przepływ pracy testowej. Wydaje się, że Haskell ma wiele doskonałych i unikalnych narzędzi testowych i wiele różnych sposobów na ich integrację.

Zajrzałem:

Które wydają się działać bardzo dobrze w swoich domenach, ale szukam kompleksowe podejście do testowania i zastanawiał się, co działa dobrze dla innych ludzi.

Author: amccausl, 2010-06-25

4 answers

Poprawienie testów jednostkowych, pokrycia kodu i benchmarków polega głównie na wybraniu odpowiednich narzędzi.

  • test-framework zapewnia punkt kompleksowej obsługi, aby uruchomić wszystkie twoje HUnit Test-cases i QuickCheck Właściwości z jednej uprzęży.
  • Zakres kodu jest wbudowany w GHC w postaci narzędzia HPC .
  • Criterion zapewnia kilka całkiem świetnych maszyn benchmarkingowych

Użyję jako przykładowego pakietu, który właśnie uruchomiłem enabling with unit testing, code coverage, and benchmarks:

Http://github.com/ekmett/speculation

Możesz zintegrować swoje testy i Benchmarki bezpośrednio z plikiem cabal, dodając dla nich sekcje i maskując je za flagami, aby nie sprawiały, że każdy użytkownik twojej Biblioteki musiał mieć dostęp (i chcieć używać dla siebie) do dokładnej wersji narzędzi testowych, które posiadasz wybrany.

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

Następnie możesz powiedzieć cabal o tym, jak uruchomić swój zestaw testów. ponieważ test cabal jeszcze nie istnieje -- mamy studenta pracującego nad nim na tegoroczne lato kodu! -- najlepszy mechanizm jaki mamy to oto jak używać mechanizmu hakowego użytkownika Cabala. Oznacza to przejście na "niestandardową" kompilację z cabalem i skonfigurowanie testu. Przykład testu uruchamiającego program testowy napisany z test-framework, a następnie stosuje hpc do profilu można go znaleźć tutaj:

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

A następnie możesz użyć test-framework, aby połączyć testy QuickCheck i HUnit w JEDEN program:

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

Plik cabal jest ostrożny, aby włączyć-fhpc, aby włączyć testowanie pokrycia kodu, a następnie testHook w konfiguracji.LHS ręcznie uruchamia hpc i pisze jego wyjście do twojego katalogu dist.

Dla benchmarkingu, historia jest trochę bardziej ręczna, nie ma opcji "cabal benchmark". Możesz podłączyć swoje benchmarki do haka testowego, ale lubię je uruchamiać ręcznie, ponieważ Criterion ma tak wiele opcji raportowania graficznego. Możesz dodać swoje benchmarki do pliku cabal, jak pokazano powyżej, nadać im oddzielne flagi kompilacji, ukryć je za flagą cabal, a następnie użyć Criterion, aby zrobić wszystkie ciężkie podnoszenie:

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

Możesz następnie uruchomić swoje benchmarki z linii poleceń i uzyskać wyskakujące okna KDE z wynikami benchmarka itp.

Ponieważ w praktyce żyjesz w cabal i tak podczas tworzenia kodu Haskell, ma to sens, aby zintegrować swój toolchain z nim.

Edit: teraz istnieje wsparcie testów Cabal. Zobacz też http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites

 70
Author: Edward KMETT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 16:34:05

Podejście jest w RWH ch 11 i w XMonad wynosi w przybliżeniu:

  • Stan wszystkich właściwości systemu w QuickCheck
  • Pokaż pokrycie testowe z HPC.
  • Potwierdź zachowanie przestrzeni za pomocą profilowania sterty.
  • Potwierdź zachowanie wątku / równoległości za pomocą ThreadScope .
  • Potwierdź zachowanie microbenchmark za pomocą kryterium .

Gdy twoje główne niezmienniki zostaną ustalone przez QuickCheck, ty może rozpocząć refaktoryzację, przenosząc te testy na niezmienniki typu.

Praktyki wspierające twoje wysiłki:

  • Uruchom uproszczoną regresję QuickCheck przy każdym zatwierdzeniu.
  • Opublikuj szczegóły dotyczące HPC.
 52
Author: Don Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 19:23:34

Pakiet test-framework jest naprawdę niesamowity. Możesz łatwo zintegrować testy HUnit i QuickCheck oraz uzyskać pliki wykonywalne, które uruchamiają tylko określone pakiety, oparte na flagach wiersza poleceń, z wieloma celami wyjściowymi.

Testowanie i profilowanie to jednak różne bestie. Do profilowania ustawiłem osobny plik wykonywalny, który podkreśla tylko sekcję, którą chcesz profilować, i po prostu przyglądając się uważnie wynikom profilowania buduje i uruchamia (z -prof-auto-all do kompilacji i +RTS - p dla flagi runtime).

 14
Author: sclv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 09:38:48

Do testowania, polegam na właściwości HUnit i QuickCheck i używać Haskell test Framework aby zebrać wszystkie testy jednostkowe i wszystkie właściwości QuickCheck automatycznie.

Zastrzeżenie: jestem głównym twórcą Haskell test Framework.

 10
Author: stefanwehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 10:50:46