Haskellテストワークフロー


101

私は新しいHaskellプロジェクトを開始したばかりで、最初から優れたテストワークフローをセットアップしたいと思っていました。Haskellには優れた独自のテストツールが数多くあり、それらを統合するさまざまな方法があるようです。

私は調べました:

どのドメインでも非常にうまく機能しているように見えますが、私はテストへの包括的なアプローチを探しており、他の人に何がうまく機能しているか疑問に思っていました。

回答:


70

単体テスト、コードカバレッジ、およびベンチマークを正しく取得するには、主に適切なツールを選択する必要があります。

  • test-frameworkは、すべてのHUnitテストケースとQuickCheckプロパティをすべて1つのハーネスから実行するためのワンストップショップを提供します。
  • コードカバレッジは、HPCツールの形でGHCに組み込まれています。
  • 基準は、いくつかの非常に優れたベンチマーク機構を提供します

単体テスト、コードカバレッジ、ベンチマークで有効にしたばかりのパッケージを実行例として使用します。

http://github.com/ekmett/speculation

セクションを追加し、フラグの背後にマスクしてテストとベンチマークを直接cabalファイルに統合して、ライブラリのすべてのユーザーがアクセスできるように(そして自分自身で使用したい)ようにすることができます。 )選択したテストツールの正確なバージョン。

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

次に、テストスイートの実行方法をcabalに伝えることができます。カバールテストはまだ存在しないので、今年の夏のコードのためにテストしている学生がいます!-私たちが持っている最高のメカニズムは、 cabalのユーザーフックメカニズムの使用方法です。これは、cabalを使用して「カスタム」ビルドに切り替え、testHookを設定することを意味します。test-frameworkで記述されたテストプログラムを実行し、hpcをプロファイルに適用するtestHookの例は、次の場所にあります。

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

そして、テストフレームワークを使用して、QuickCheckテストとHUnitテストを1つのプログラムにバンドルできます。

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

そこのcabalファイルは、コードカバレッジテストを有効にするために-fhpcをオンにするように注意しており、次にSetup.lhsのtestHookが手動でhpcを実行し、その出力をdist dirに書き込みます。

ベンチマークについては、ストーリーはもう少しマニュアルであり、「カバルベンチマーク」オプションはありません。ベンチマークをテストフックに接続することもできますが、Criterionには非常に多くのグラフィカルレポートオプションがあるため、手動で実行するのが好きです。上記のように、ベンチマークをcabalファイルに追加し、個別のコンパイルフラグを付け、それらをcabalフラグの後ろに隠し、Criterionを使用してすべての重い作業を行うことができます。

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

その後、コマンドラインからベンチマークを実行し、ベンチマーク結果などを含むポップアップKDEウィンドウを取得できます。

実際にはHaskellコードの開発中はとにかくcabalに住んでいるので、ツールチェーンをそれと統合することは非常に理にかなっています。

編集:Cabalテストのサポートが存在します。http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suitesを参照してください


2
そしてcabal bench今も存在しています。
nh2

6
そうだね。私はを指しますgithub.com/ekmett/lensの対処方法のより近代的な例として、cabal test及びcabal bench、混合HUnitdoctestおよびquickcheck用いた試験に基づくcriterionベンチマークを。speculationpredates cabal testおよびのコードcabal bench
エドワードKMETT

2
@EdwardKmett:lenseパッケージはexitcode-stdio-1.0テストスイートインターフェイスのみを使用することを確認しました。Cabalのユーザーガイドには、「detailed-1.0インターフェース用に新しいテストスイートを作成することが望ましい」と記載されています。何かコメントはありますか?
警官

9
@copton彼らはそれを実装したことはありません。そのドキュメントは、持ち帰って撮影する必要があります。
エドワードKMETT 2013年

2
残念ながら、githubへのリンクはすべてmasterブランチを指しており、テストに関連するすべてがcabalファイルから削除されているため、リンクは事実上壊れています。
Andrew Thaddeus Martin

52

このアプローチはRWH ch 11で提唱されており、XMonadではおおよそ次のとおりです。

QuickCheckを介して主要な不変条件が確立されたら、リファクタリングを開始し、それらのテストを型不変条件に移動できます。

あなたの努力をサポートするための実践:

  • コミットごとに簡略化されたQuickCheck回帰を実行します。
  • HPCカバレッジの詳細を公開します。

14

テスト・フレームワークパッケージは本当に素晴らしいです。HUnitテストとQuickCheckテストを簡単に統合し、コマンドラインフラグに基づいて、指定されたスイートのみを実行する実行可能ファイルを複数の出力ターゲットで取得できます。

ただし、テストとプロファイリングは別の動物です。プロファイリングでは、プロファイリングするセクションのみに重点を置き、ビルドと実行のプロファイリングの結果を注意深く見ている別の実行可能ファイルをセットアップします(コンパイルには-prof-auto-allを、ランタイムには+ RTS -pを使用します)。国旗)。


テストフレームワークの後継としてより積極的に維持されているのはおいしいです
sjakobi 2017年

10

テストでは、HUnitプロパティとQuickCheckプロパティを使用し、Haskell Test Frameworkを使用してすべてのユニットテストとすべてのQuickCheckプロパティを自動的に収集します。

免責事項:私はHaskell Test Frameworkの主な開発者です。


5
ステファン、これに関するドキュメントはほとんどありません。それが人気を維持する主な理由だと思います。間違いなく注目に値する質問がここにあります:stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov

2
HTFの新しいリリース0.9.0.0には、非常に多くのドキュメントが付属しています。また、開発をgithub.com/skogsbaer/HTFに移動しました。これにより、人々がHTFを使用しやすくなり、HTFについて質問しやすくなります。お気軽にどうぞ!
stefanwehr 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.