Haskell-Testworkflow

101

Ich habe gerade ein neues Haskell-Projekt gestartet und wollte von Anfang an einen guten Test-Workflow einrichten. Es scheint, dass Haskell viele exzellente und einzigartige Testwerkzeuge und viele verschiedene Möglichkeiten zur Integration hat.

Ich habe untersucht:

Was alle in ihren Bereichen sehr gut zu funktionieren scheinen, aber ich suche nach einem umfassenden Testansatz und habe mich gefragt, was für andere Menschen gut funktioniert hat.

amccausl
quelle

Antworten:

70

Um Unit-Tests, Codeabdeckung und Benchmarks richtig zu machen, müssen Sie hauptsächlich die richtigen Tools auswählen.

  • Das Test-Framework bietet eine zentrale Anlaufstelle, um alle Ihre HUnit -Testfälle und QuickCheck- Eigenschaften von einem Gurt aus auszuführen .
  • Die Codeabdeckung ist in Form des HPC- Tools in GHC integriert .
  • Criterion bietet einige großartige Benchmarking-Maschinen

Ich werde als laufendes Beispiel ein Paket verwenden, das ich gerade mit Unit-Tests, Codeabdeckung und Benchmarks aktiviert habe:

http://github.com/ekmett/speculation

Sie können Ihre Tests und Benchmarks direkt in Ihre Kabalendatei integrieren, indem Sie Abschnitte für sie hinzufügen und sie hinter Flags maskieren, damit sie es nicht schaffen, dass jeder Benutzer Ihrer Bibliothek Zugriff darauf hat (und für sich selbst verwenden möchte) ) die genaue Version der von Ihnen ausgewählten Testtools.

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

Anschließend können Sie cabal mitteilen, wie Ihre Testsuite ausgeführt werden soll. Da es noch keinen Kabaltest gibt, haben wir einen Studenten, der daran für den diesjährigen Code-Sommer arbeitet! - Der beste Mechanismus, den wir haben, ist Hier erfahren Sie, wie Sie den Benutzerhakenmechanismus von cabal verwenden. Dies bedeutet, zu einem 'Custom'-Build mit Kabale zu wechseln und einen TestHook einzurichten. Ein Beispiel für einen TestHook, der ein mit Test-Framework geschriebenes Testprogramm ausführt und dann HPC auf das Profil anwendet, finden Sie hier:

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

Und dann können Sie das Test-Framework verwenden, um QuickCheck- und HUnit-Tests in einem Programm zu bündeln:

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

In der dortigen Kaballendatei wird sorgfältig darauf geachtet, -fhpc zu aktivieren, um das Testen der Codeabdeckung zu ermöglichen. Anschließend führt der testHook in Setup.lhs manuell hpc aus und schreibt seine Ausgabe in Ihr dist-Verzeichnis.

Für das Benchmarking ist die Geschichte etwas manueller, es gibt keine Option für den Kabalen-Benchmark. Sie könnten Ihre Benchmarks in Ihren Test-Hook einbinden, aber ich führe sie gerne von Hand aus, da Criterion so viele grafische Berichtsoptionen bietet. Sie können Ihre Benchmarks wie oben gezeigt zur Kaballendatei hinzufügen, ihnen separate Kompilierungsflaggen geben, sie hinter einer Kabalenflagge verstecken und dann Criterion verwenden, um das gesamte schwere Heben durchzuführen:

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

Sie können dann Ihre Benchmarks über die Befehlszeile ausführen und Popup-KDE-Fenster mit Benchmark-Ergebnissen usw. abrufen.

Da Sie in der Praxis sowieso in Kabalen leben, während Sie Haskell-Code entwickeln, ist es sehr sinnvoll, Ihre Toolchain in diese zu integrieren.

Bearbeiten : Cabal Test Unterstützung gibt es jetzt. Siehe http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites

Edward KMETT
quelle
2
Und cabal benchjetzt existiert es auch.
nh2
6
Wahr. Ich würde darauf hinweisen github.com/ekmett/lens als ein moderneres Beispiel , wie zu behandeln cabal testund cabal bench, Mischen HUnit, doctestund quickcheckbasierte Tests mit criterionBenchmarks. Der Code in speculationälter als cabal testund cabal bench.
Edward KMETT
2
@EdwardKmett: Ich habe gesehen, dass das Linsenpaket nur die Exitcode-stdio-1.0-Testsuite-Schnittstelle verwendet. In der Cabal-Bedienungsanleitung heißt es: "Es wird bevorzugt, dass neue Testsuiten für die detaillierte 1.0-Oberfläche geschrieben werden." Irgendwelche Kommentare dazu?
Copton
9
@copton Sie haben es nie implementiert. Diese Dokumentation muss zurückgenommen und erschossen werden.
Edward KMETT
2
Leider zeigten die Links zu Github alle auf den Hauptzweig, und es sieht so aus, als ob alles, was mit Testen zu tun hat, aus der Kabalendatei entfernt wurde, sodass die Links effektiv unterbrochen werden.
Andrew Thaddeus Martin
52

Der Ansatz wird in RWH ch 11 befürwortet und in XMonad ist ungefähr:

Sobald Ihre Hauptinvarianten über QuickCheck erstellt wurden, können Sie mit dem Refactoring beginnen und diese Tests in Typinvarianten verschieben.

Praktiken zur Unterstützung Ihrer Bemühungen:

  • Führen Sie bei jedem Commit eine vereinfachte QuickCheck-Regression aus.
  • Veröffentlichen Sie Details zur HPC-Abdeckung.
Don Stewart
quelle
14

Das Test-Framework-Paket ist wirklich großartig. Sie können problemlos HUnit- und QuickCheck-Tests integrieren und ausführbare Dateien abrufen, die nur bestimmte Suites ausführen, basierend auf Befehlszeilenflags, mit mehreren Ausgabezielen.

Testen und Profilieren sind jedoch verschiedene Bestien. Für die Profilerstellung habe ich eine separate ausführbare Datei eingerichtet, die nur den Abschnitt hervorhebt, den Sie profilieren möchten, und nur die Ergebnisse der Profilerstellung und -ausführungen genau betrachtet (mit -prof-auto-all für die Kompilierung und + RTS -p für eine Laufzeit Flagge).

sclv
quelle
Ein aktiver gepflegter Nachfolger des Test-Frameworks ist lecker .
Sjakobi
10

Zum Testen verlasse ich mich auf die Eigenschaften HUnit und QuickCheck und verwende das Haskell Test Framework , um alle Komponententests und alle QuickCheck-Eigenschaften automatisch zu erfassen.

Haftungsausschluss: Ich bin der Hauptentwickler des Haskell Test Framework.

stefanwehr
quelle
5
Stefan, dazu gibt es so wenig Dokumentation. Ich denke, das ist der Hauptgrund dafür, dass es unbeliebt bleibt. Es gibt eine Frage hier auf jeden Fall Ihre Aufmerksamkeit wert: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov
2
Die neue Version 0.9.0.0 von HTF enthält jetzt eine Menge Dokumentation. Außerdem habe ich die Entwicklung auf github.com/skogsbaer/HTF verschoben . Ich hoffe, dies erleichtert es den Menschen, HTF zu verwenden und Fragen zu HTF zu stellen. Fühlen Sie sich frei, dies zu tun!
Stefanwehr