2009-02-23 21 views
36

Quickcheckとその亜種(Javaにも1つあります)は興味深いようです。しかし、学問的な興味とは別に、実際のアプリケーションテスト(例えば、GUIアプリケーションやクライアント/サーバー、あるいはStackOverflow自体を取る)で本当に便利ですか?同様のテストジェネレータで経験したことは感謝しています。実際のプロジェクトでQuickcheckを使用しましたか

答えて

48

はい、実際にはいないけど、もともとQuickCheckを開発した人のもとで勉強しました。彼は本当に面白い人です。

2004年には、私たちはHaskellプログラムをテストするためにQuickCheckを使用することを余儀なくされました。ハスケルはそれ自体が気が狂っていたが、あなたがそれを稼働させたときにそれほど素晴らしいものではなかったので、ほとんど悪かった。

ジョンはそれ以来、彼が数年前に書いたEricssionの複雑なテレコムハードウェアのテストを手助けしました。彼は20,000万本程度のコードラインでバグを発見しました。彼はすばらしいスピーカーだから、常に彼がそれをうまく演奏していることを聞いて喜んでいる。でも、QuickCheckで何をしたのかは全く新しいものだった。そこで、私は彼に、市場にこれをもたらすことに関心があったのかと尋ねました。彼はこのアイデアに門戸を開いていましたが、(QuickCheckをベースにした)彼のビジネスは比較的新しいものでした。これは2007年です。私の要点は、QuickCheckを使用しても終了しない場合でも、QuickCheckから学ぶことができるということです。

しかし、QuickCheckとは何ですか?これはコンビナトリアルテストフレームワークであり、プログラムをテストする興味深い方法です。 Microsoft Researchの人たちはPexというようなものを作っています。 PexはあなたのILを調べて自動的にテストを生成します。しかし、Johnは関数の入力とテストのプロパティの可能性についてジェネレータを記述します。プロパティは簡単にテストできるものであり、より正式なものです。例えばリストを逆転する?リストを逆にすることは、リストを2つの半分に分割し、それぞれを個別に逆順にし、逆の2つの半分を逆順に連結することと同じです。

1,2,3,4 // original 
1,2 3,4 // split into A and B 
2,1 4,3 // reverse A and B 
4,3,2,1 // concat B and A 

これは、仕様と呼ばれるQuickCheckでテストするのに最適なプロパティであり、結果は非常に驚異的です。

Pexは素晴らしいですが、QuickCheckほどクールではありません.Pexは物事を単純化しますが、QuickCheckはそうしていますが、良い仕様を書くには多くの努力が必要です。

QuickCheckの機能は、エラーが発生したときにテストが失敗した入力を最小限のフォームに減らすことです。州の進展があなたのテストを失敗させた原因について詳しく説明しています。他のテストフレームワークと比較して、あなたのコードを無差別に壊すようにしようとします。

これは、テスト仕様書の記述方法によって可能になりました。 QuickCheckは入力を生成するために擬似ランダム性に依存しています。そのため、バックトラックが可能で、テストに合格しない小さな入力を見つけることができます。

QuickCheckのプロパティを書くのにはもっと多くの作業がありますが、最終的な結果はより良いテストです。 John自身が言っているように、バグの70%は単体テストで捕捉されますが、その30%はプログラムがクラッシュする原因となります。クイックチェックは最後の30%をテストしています。

+2

非常によく言われています。しかし、私の質問に戻って、私たちは機能が純粋でないかもしれない他のケースでそれを使うことができるでしょうか(それは単に副作用として何かをしているかもしれません)。たとえば、ある場所から別の場所にファイルをコピーする関数を考えてみましょう。 – amit

+1

ああ、あなたの機能には副作用があることは本当に問題ではないことは確かです。それ自体問題はありますが、QuickCheckの使用を妨げるものではありません。 Ericssionテストスーツには副作用があり、あなたはそれを回避する方法があります。 –

+1

状態の進行について注意深く考えていくことが必要です。しかし、基本原則が適用されます。減らす部分はややこしいですが、基本的にはうまくいくと思います。クラッシュが起こっている間は、入力を誤って入力を取り除いてください。それは純粋な関数に限定されません。 –

7

私は個人的な多くのもののためにQuickCheckを使用しています。過去6ヶ月以内に

  • Ran QuickCheckを使用して、イメージコンプレッサーで色変換と離散コサイン変換をテストします。

  • Ran QuickCheckを使用して、数値最適化を行いました。

  • Ran QuickCheckは、BentleyとSedgewickのスタイルで3値検索ツリーをテストします。

QuickCheckはめったにすべて私のユニットテストのニーズを満たしていないが、それは始めるための素晴らしい方法だ---とQuickCheck法は良いドキュメントを作ります。

+0

明らかに、QuickCheckはIOモナドのコードをテストするのに適していませんが、QuickCheckはすべての純粋なコードをテストするのに適していますか?そうでない場合は、どこに適していますか? –

8

私は離散事象シミュレーションを含む本物のハスケル問題を行った。そこで私は、MVarsとChannelsに相当するものと一緒に、継続モナドに基づいてDESライブラリを作成しました。私はこれが適切に機能することを確認する必要があったので、たとえば、チャネルに書き込まれた2つのストリームの並行データが、何もドロップせずに正しくマージされることを示すQuickCheckプロパティを書きました。

私はまた、Ranged SetsDecimalライブラリのプロパティを文書化して確認するためにQuickCheckを使用しました。

私の経験では、QuickCheckがときどき素晴らしいです。重要なプロパティを簡潔な方法で要約できれば、そのプロパティを提供するアルゴリズムは毛深いものですが、QuickCheckは大きな勝利です。一方、私はしばしばアルゴリズムが私が検証したいプロパティと同等であることを見出します。その場合、私はより簡単なプロパティを探します。たとえば、関数 "foo"が非厳密に単調であると仮定したとします。次に書くことができます

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y) 
2

小さなヘルパーツールを開発するためには、本番環境でHaskellを使用しただけです。主に、私がハスケルを読む唯一の開発者だからです。しかし私はQuickCheckを広範囲に使用していて、C#では似たようなものは利用できないと迷惑を掛けました。だから私は試みることにしましたwrite it myself。私はPexも見ていましたが、QuickCheckがそうしている方法よりも面白くない入力を最小限に抑えるために使用されているプログラムの探索手法が見つかりました。

3

私の知る限りXMonadは、私は、任意の言語で書かれたコマンドラインプログラムの動作をテストするためにQuickCheckを使っQuickCheck

2

で徹底的にテストされています。

低レベルまたは動的に型指定されたプログラムがクラッシュする入力を見つけると、特に便利です。

便宜上、私はhttp://hackage.haskell.org/package/proctestと書きました。これには、コマンドラインプログラムをこのようにテストするためのhspecとHUnitと一緒に使用されるQuickCheckのいくつかの例が含まれています。

1

FsCheckを使用して、私たちのOCamlからF#への翻訳が正しいこと、そして最適化されたバージョンが最適化されていないバージョンと同じ働きをすることを確認します。また、NHolプロジェクトでparserコンビネータを使用しているため、レクサーとパーサのテストにも使用する予定です。

また、NUnit(XUnit for .Net)内でテストを実行できるようにするヘルパ関数もあります。 assertPropを参照してください。

0

私は、LG Linux MobileプラットフォームのSMS PDUエンコーダとデコーダをテストするためにQuickCheckを使用しました。その時点で開発したソフトウェアの(古い)バージョンはhttp://hackage.haskell.org/package/GenSmsPdu-0.1にあります。

0

私のプロジェクトではありませんが、containersパッケージはQuickCheckをかなり広く使用しています。個人的には、私がarithmoiに書き込んだ愚かな小さな一杯のふるいを比較するためにそれを使用しようとしましたが、それはarithmoiで時々segfaultsを発見しました。