[解決済み] Haskellのテストワークフロー
質問
私はちょうど新しい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
関連
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み】Haskell: リスト、配列、ベクトル、シーケンス
-
[解決済み】Haskellの入門編
-
[解決済み] angular2のテスト。ngModel' は 'input' の既知のプロパティではないので、バインドできない
-
[解決済み] Jestの「toBe」と「toEqual」の違いは何ですか?
-
[解決済み] SpockテストフレームワークにおけるMock/Stub/Spyの相違点
-
[解決済み] Golangでマップの等価性をテストするには?
-
[解決済み] モックデータを生成するためのツール?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン