Haskellのユニットテスト
質問
私はhaskellの初心者で、ユニットテストに取り組んでいますが、エコシステムが非常に分かりにくいと感じています。 HTFとHUnitの関係で混乱しています。
いくつかの例では、テストケースを設定し、それらをテストリストにエクスポートし、そしてghciで次のように実行します。
runTestsTT
(のように)。
この HUnit の例
).
他の例では、cabal ファイルに結びついたテストランナーを作成し、プリプロセッサの魔法を使って次のようにテストを探します。
git の例
. また、HTF のテストはプレフィックスとして
test_
を付けなければ実行されないようです。私はそれに関するドキュメントを見つけるのに苦労しましたが、私はちょうど誰もが持っていたパターンに気づきました。
とにかく、誰かが私のためにこれを解決するのを助けることができますか?Haskell で物事を行う標準的な方法と考えられているものは何ですか?ベストプラクティスは何でしょうか。セットアップとメンテナンスが最も簡単なのは何ですか?
どのように解決するのですか?
一般に、重要なHaskellのプロジェクトはすべて Cabal . これはビルド、配布、ドキュメント作成(haddockの助けを借りて)、そしてテストの面倒を見ます。
標準的なアプローチでは、テストは
test
ディレクトリに置き、テストスイートを
.cabal
ファイル内にテストスイートを設定します。これについては
ユーザーマニュアル
. 私のプロジェクトの1つのテストスイートは以下のようになります。
Test-Suite test-melody
type: exitcode-stdio-1.0
main-is: Main.hs
hs-source-dirs: test
build-depends: base >=4.6 && <4.7,
test-framework,
test-framework-hunit,
HUnit,
containers == 0.5.*
次に、ファイルの中で
test/Main.hs
import Test.HUnit
import Test.Framework
import Test.Framework.Providers.HUnit
import Data.Monoid
import Control.Monad
import Utils
pushTest :: Assertion
pushTest = [NumLit 1] ^? push (NumLit 1)
pushPopTest :: Assertion
pushPopTest = [] ^? (push (NumLit 0) >> void pop)
main :: IO ()
main = defaultMainWithOpts
[testCase "push" pushTest
,testCase "push-pop" pushPopTest]
mempty
ここで
Utils
の上に、より洗練されたインターフェイスを定義しています。
HUnit
.
軽量なテストには クイックチェック . これは、短いプロパティを書いて、一連のランダムな入力に対してそれらをテストすることができます。例えば
-- Tests.hs
import Test.QuickCheck
prop_reverseReverse :: [Int] -> Bool
prop_reverseReverse xs = reverse (reverse xs) == xs
そして
$ ghci Tests.hs
> import Test.QuickCheck
> quickCheck prop_reverseReverse
.... Passed Tests (100/100)
関連
-
[解決済み] tornado + async defのunittestはどのように行うのですか?
-
[解決済み] MOCKITOとは何か、Junitとはどう違うか
-
[解決済み] モッキングとは?
-
[解決済み] C# "internal "アクセス修飾子でユニットテストを行う場合
-
[解決済み] NUnit vs. MbUnit vs. MSTest vs. xUnit.net [終了しました。]
-
[解決済み】ユニットテストと機能テストの違いは何ですか?
-
[解決済み] テスト駆動開発のデメリット?[クローズド]
-
[解決済み] モックオブジェクトは何のためにあるのか?
-
[解決済み] Visual Studio 2015または2017でユニットテストが検出されない
-
[解決済み】Haskellの入門編
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaプロジェクト。ApplicationContextのロードに失敗しました
-
[解決済み] ユニットテストは努力に値するか?[クローズド]
-
[解決済み] テスト駆動開発のデメリット?[クローズド]
-
[解決済み] モックオブジェクトは何のためにあるのか?
-
[解決済み] Spring Dataのリポジトリをテストするには?
-
[解決済み] いつモックすればいい?
-
[解決済み] GUIをユニットテストするにはどうしたらいいですか?
-
[解決済み] ScalaTestとScala Specsのユニットテストフレームワークの違いは何ですか?
-
[解決済み] ユニットテストがそんなに素晴らしいなら、なぜもっと多くの企業がやらないのですか?[クローズド]
-
[解決済み] パニックが発生したことを確認するRustのユニットテストはどのように書けばよいですか?