2011-12-17 3 views
7

私は現在働いている小さなサッカーゲームのための有限状態機械モジュールを書いた。これは、FSM(基本的に状態と遷移)を設定するためのインタフェースを提供します。各状態について、入力および終了時に、またはFSMが同じ状態のままで放置される機能を提供することができます。これらの関数はいくつかのメッセージを返します。また、時変状態を生成し、時間の経過と共に発生するメッセージを収集するリアクティブインターフェイス(Yampa)も提供します。コードはここにData/FSM.hsです。Haskell:quickcheckで(反応性の)FSMをテストするには?

私はこのモジュールをテストするための良いアプローチを探しています。純粋なので、私はquickcheckを試してみることを考えました。私はクイックチェックで経験していないので、任意のヒントが評価される!これまでの私の基本的な理解:FSMを多かれ少なかれランダムに構築し、その上でいくつかの(ややランダムな)遷移を実行するいくつかの機能を提供します。しかし、私はそのようなテストをどのように構築するのかよく分かりません。

+0

どのようなテストを書きたいですか?どのプロパティまたはビヘイビアを検証する必要がありますか? –

+0

まあ、おそらく問題は私が本当に知っているのではない...あらゆる有効なfsmのような単純なものに対しては、遷移の有限リストは状態「Nothing」または状態「Just s 'sは状態fsmで "、大丈夫です。しかし、「すべての有効なfsmと(時変)遷移と認識のリスト、移行パスに沿ったすべてのメッセージ収集をリストアップする」などのより複雑なものは、これを正式化する方法はわかりません。私はそれのためのユニットテストを設定する方法を知っているだろうが、クイックチェックと私は少し失われています。 – martingw

+0

リンクが無効です(https://patch-tag.com/r/martingw/Rasenschach/snapshot/current/content/pretty/Data/FSM.hs)。見つからないアーカイブはありません – icc97

答えて

4

まず、クイックチェックは広範囲の一般的なプロパティを検証するのに最適です。何らかの型の任意のデータが与えられた場合、いくつかの操作を実行し、述部を使用して結果に入力に対するプロパティがあることを確認します。ステップバイステップの動作の正確な詳細を含むものは、このスタイルではうまく動作しない可能性があります。また、QuickCheckですべてを実行する必要はありません。

あなたがコメントで与えたより複雑な例に基づいて、単にFSMと入力とともに期待される出力を生成すると考えたことはありますか?構成によって正しいことがわかっている望ましい結果を生成できる場合は、入力でFSMを実行し、実際の結果と構築されたバージョンを比較することができます。

一部の入力で関数をテストするようにQuickCheckプロパティを考えるのではなく、1つ以上の値がテスト対象の関数で表現された述語を満たすかどうかをチェックするのに役立ちます。この値の集合(複数の入力、出力、必要なものを含む)は、QuickCheckによって実際にランダムに生成されるものです。

+0

特定のfsmに対して特定の結果をテストし、段階的な状況ではHUnitで入力し、より一般的なプロパティではquickcheckを使用するのが最も良い方法でしょうか? – martingw

+1

@martingw:私はミックスが最高のデフォルトアプローチだと思います。 Hackageには、HUnit、QuickCheck、および多分他のものの統一テストハーネスを提供することさえあると確信しています。可能であればQuickCheckを優先すべきだと主張しているかもしれませんが、テストしているすべてが、経路の詳細ではなく、AからBになることが最も効果的です。 –

関連する問題