1. ホーム
  2. testing

[解決済み] Haskellのテストワークフロー

2023-01-04 14:33:02

質問

私はちょうど新しいHaskellプロジェクトを始め、最初から良いテストワークフローをセットアップしたいと思いました。 Haskell には、多くの優れたユニークなテストツールと、それらを統合する多くの異なる方法があるように思われます。

私は調べました。

これらはすべて、それぞれの領域で非常にうまく機能しているように見えますが、私はテストへの包括的なアプローチを探しており、他の人々にとって何がうまく機能しているのか不思議に思っていました。

どのように解決するのですか?

ユニットテスト、コードカバレッジ、およびベンチマークを正しく行うには、ほとんどの場合、正しいツールを選択することです。

  • test-frameworkはあなたのすべての HUnit のテストケースと QuickCheck プロパティをすべて 1 つのハーネスから実行できます。
  • コードカバレッジはGHCに組み込まれており、その形式は HPC ツールの形で組み込まれています。
  • Criterion は、かなり優れたベンチマーク装置を提供します。

私がユニットテスト、コードカバレッジ、およびベンチマークを有効にし始めたばかりのパッケージを実例として使用します。

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

そして、test-frameworkを使って、QuickCheckとHUnitのテストを1つのプログラムに束ねることができるのです。

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

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

ベンチマークについては、話はもう少し手動で、'cabal benchmark' オプションはありません。ベンチマークをテストフックに配線することもできますが、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