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
cabal bench
jetzt existiert es auch.cabal test
undcabal bench
, MischenHUnit
,doctest
undquickcheck
basierte Tests mitcriterion
Benchmarks. Der Code inspeculation
älter alscabal test
undcabal bench
.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:
quelle
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).
quelle
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.
quelle