2011-01-23 9 views
8

QuickCheckでテストしたときにプロパティテストが失敗した理由を表示するにはどうすればよいですか?quickcheckでテストプロパティが失敗した理由を表示するには?

例えば考えてみましょう:

prop a b = res /= [] 
    where 
     (res, reason) = checkCode a b 

その後のセッションは次のようになります。

> quickCheck prop 
Falsifiable, after 48 tests: 
42 
23 

しかし、デバッグのために、quickCheck falsifableの一環として、失敗の理由を示すために、本当に便利です報告する。

私はこのようにそれをハッキングしています

prop a b = if res /= [] then traceShow reason False else True 
    where 
     (res, reason) = checkCode a b 

はそれを行うためのより良い/よりよい以上quickcheckish方法はありますか?

答えて

9

あなたの「理由」変数には、何が問題になったかに関するテスト固有のデータが含まれていると仮定します。代わりに、成功/失敗/無効条件と何が間違っているかを説明する文字列を含む "結果"を返すことができます。結果を返すプロパティは、Boolを返すプロパティとまったく同じ方法でQuickCheckで処理されます。このよう

(編集):それはあなたが望むTest.QuickCheck.P​​ropertyで定義された "結果" タイプであることを

module QtTest where 

import Test.QuickCheck 
import Test.QuickCheck.Property as P 


-- Always return success 
prop_one :: Integer -> P.Result 
prop_one _ = MkResult (Just True) True "always succeeds" False [] [] 


-- Always return failure 
prop_two :: Integer -> P.Result 
prop_two n = MkResult (Just False) True ("always fails: n = " ++ show n) False [] [] 

注意。

prop_three :: Integer -> Property 
prop_three n = printTestCase ("always fails: n = " ++ show n) False 

としてあなたではなく、直接コンストラクタを呼び出すよりも、検索結果を構成する手助けTest.QuickCheck.P​​ropertyで定義されたいくつかのコンビネータ、私はそれらを使用するより良いスタイルだろうと思いもあります。

+0

"reason"変数(何らかの文字列または表示可能な値であると仮定します)が失敗した場合に表示されるように、Resultを正確に返す方法を簡単な例で教えてください。 – maxschlepzig

+0

更新いただきありがとうございます。私はあまりにもhttp://www.cse.chalmers.se/~rjmh/QuickCheck/manual.htmlに固執していたし、最新の包括的なモジュール文書http://hackage.haskell.org/packages/を見ていない。アーカイブ/ QuickCheck/2.4.0.1/doc/html/Test-QuickCheck-Property.html - それは最近の追加であるようです - quickCheck 2.1はそれを含んでいません。 – maxschlepzig

2

QuickCheckは関数への入力を提供するので、テスト対象のコードは純粋です(正しいですか?)ので、関数に入力して結果を得ることができます。これらの入力では、元の関数の調整が間に合わなくなるまで繰り返しテストすることができるので、これはより柔軟です。

+2

質問のポイントは便利です。テストの成功はすべて可能な限り自動化することです。 ghciセッションを開き、潜在的な高価な機能を再計算することは理にかなっていません。つまり、クイックチェックは、*失敗していない*プロパティテストの出力を豊かにするために 'collect'、' classify 'を提供しています。そのような濃縮はオプションであり、柔軟性を全く低下させない。 – maxschlepzig

+1

これは実用的な理由もあります。クイックチェックのプロパティは、任意に複雑になる可能性があるため、テストの「出力」は必ずしも明確ではありません。コードを「ヘイここに私が興味を持っている中間価値がある! IIRC QuickCheckには、この目的のためにベーキングされたものはありませんが、この書き直しを行う意思があると仮定すると、この機能を提供できない理由はありません。 –

関連する問題