他人のHaskell日記 RSSフィード

Haskell初心者が、リハビリがてらに「ふつける」と「入門Haskell」片手に、試行錯誤するサイト。

2006-06-19

QuickCheckオンラインマニュアル部分訳 QuickCheckオンラインマニュアル部分訳 - 他人のHaskell日記 を含むブックマーク

写経がてら訳してみました。

英語不得手なので間違っているかも・・。

http://www.cs.chalmers.se/~rjmh/QuickCheck/manual.html

QuickCheckって何?

QuickCheckHaskellプログラムを自動的にテストするツールです。

プログラマはプログラムの内部で満たされなくてはならない特性

(例えば、任意の値の絶対値は常に0より大きい、等)を与えることで仕様を定義します。

そうするとQuickCheckは、ランダムに生成された様々なテストケースについて、

その特性が本当に常に保たれているのかテストします。

仕様Haskellで表現します。

そのためにQuickcheckライブラリで宣言されているコンビネータを使います。

QuickCheckコンビネータを使って特性を宣言し、テストデータの分布を観察し、テストデータの生成機を定義します。

簡単な例

特性は次のように宣言します。

prop_RevRev xs = reverse (reverse xs) == xs
  where types = xs::[Int]

この特性が満たされているかチェックするために、QuickCheckを実行します。

Main> quickCheck prop_RevRev
OK, passed 100 tests.

特性が満たされなかったとき、QuickCheckは反例を表示します。

例えば、次のように定義してみます。

prop_RevId xs = reverse xs == xs
  where types = xs::[Int]

さて、どうなるか見てみましょう

Main> quickCheck prop_RevId
Falsifiable, after 1 tests:
[-3,15]

Quickcheckを使おう

Quickcheckを使うにはモジュールQuickCheck.hs),をダウンロードしなければなりません。

なるべく スクリプトquickCheck)もダウンロードした方がよいでしょう。

(訳注:GHCには標準付属している事を確認.import Test.QuickCheck)

定義やテストデータ生成機を含んだ全てモジュールにたいしてquickCheckモジュールインポートしましょう。

特性をテストするには定義されたモジュールHugsに読み込んだのちに、次のようにquickCheckを呼びます。

quickCheck <特性名>

あるいはスクリプトを実行させてもいいでしょう。

 > quickCheck <オプション> <ファイル名>

これで与えられたモジュールの中で定義された全ての特性がチェックされます。

コマンドラインオプションHugsオプションと同じ物を与えることが出来ます。

特性をチェックするためにHugs仕様する必要はありません。

どんなHaskell98の実装であっても十分です。

しかしながら, quickCheck スクリプトシステムHugsインストールされていることを前提に動きます

だからrunhugsの場所を指定するためにスクリプト編集する必要はないと思います

何がテストされているかどうすれば分かるの?

バージョンによってはHugsは、式を評価する前に、その式を表示します。

これなら、どの特性がテストされていてどんな特性が満たされてないのかわかりますよね。

もし、Hugsがそのようなことをしないバージョンをお使いなら、quickCheckに+namesフラグを与えましょう

 > quickCheck +names <オプション> <ファイル名>

こうすれば全ての特性の名前をテスト前に表示します

テストがループしたりエラーに遭遇したらどうすればいいの

こんなケースでは、特性が満たされないことを私たちは知っていますが

Quickcheckは反例を表示することはありません。

こんな場合のための他のテスト関数が用意されています。

これを使ってテストをやりなおしましょう。

verboseCheck <property-name>

これで、テストを実行する前に毎回テストしようとしているケースが何なのか表示します。

エラーが発生したりループに陥る前に最後に表示されたケースこそが、反例になります。

特性

特性はHaskell関数の定義として記述されます。関数の名前はprop_から始まっている必要があります。

特性は、そのパラメータがなんであっても定量的でなければありません。だから

prop_RevRev xs = reverse (reverse xs) == xs
  where types = xs::[Int]

この場合は、等式は全てのリストxsについて成り立たなければなりません。 . Technical note.

特性は単相型でなければいけません。

多層型の特性は上記の例のように、特定の型に制約されなければ、テストには使えません。

次のようにwhere節の中で引数の型を明言するのが気軽でしょう。

  where types = (x1 :: t1, x2 :: t2, ...)

注:typesは何か意味を持ったキーワードではありません。

x1やx2の型を制約するための便利な場所を提供するための単なるローカル意味の無い関数宣言に過ぎません。

特性が返す値の型は普通Boolになるでしょう。あるいは以下に述べる他のコンビネータを使って定義すれば話は別です。

条件付き特性

特性は次のような形を取れます。

	<条件式> ==> <特性>

例えば

ordered xs = and (zipWith (<=) xs (drop 1 xs))
insert x xs = takeWhile (<x) xs++[x]++dropWhile (<x) xs

prop_Insert x xs = ordered xs ==> ordered (insert x xs)
  where types = x::Int

「条件式が満たされるときは必ず、==>の後の特性も満たされる」という特性を意味します。

条件式を満たさないテストケースは予め捨てられます。

テストケースの生成は、条件式を満たすケースが100個見つかるか、

テストケースの生成の試行回数が全体の上限に達したときに終了します。

(これは、条件式が満たされないときにループに陥ることを避けるためです。).

この場合、次のようなメッセージが表示されます。

Arguments exhausted after 97 tests.

これは「97のテストケースが 見つかり、特性はその97個のケースにおいて保たれていた」ことを示しています。

定量的特性

特性は次のような形をとれます。

	forAll <生成機> $ \<パターン> -> <特性>

例えば

prop_Insert2 x = forAll orderedList $ \xs -> ordered (insert x xs)
  where types = x::Int 

forAllの最初の引数テストデータ生成機です。それぞれの型に応じたデフォルトテストデータ生成機を用いる代わりに、

自作テストデータ生成機を与えることでテストデータの分布をコントロールすることが出来ます。

例えば、整列済リストを産み出す自作テストデータ生成機を与えることで、

あらかじめ整列されていないテストケースを省略することが出来るだけでなく

テストケース生成試行回数の全体上限に達してしまうことなく、100個のテストケースの生成が成功することを保証できます。

生成機を宣言するためのコンビネーターについては後述します。

(とりあえず、ここまで)

MeadowMeadow2012/01/06 03:09In the cmopliacetd world we live in, it's good to find simple solutions.

lwjtjrlwjtjr2012/01/06 19:07VCAmjP <a href="http://xzeizzjdpxdq.com/">xzeizzjdpxdq</a>

pxakzulxsiepxakzulxsie2012/01/07 23:43clkjNh , [url=http://yoqflftjklmz.com/]yoqflftjklmz[/url], [link=http://ibutncmxkxhr.com/]ibutncmxkxhr[/link], http://ckmtbknghhpf.com/

wecoawuyvwecoawuyv2012/01/08 21:30WKBmda <a href="http://cqaibwagxqav.com/">cqaibwagxqav</a>

majvaamajvaa2012/01/09 00:443mPG8V , [url=http://pefuwzkcazkn.com/]pefuwzkcazkn[/url], [link=http://zyovhdxfsoee.com/]zyovhdxfsoee[/link], http://wvnrgjpmaofa.com/

ozopebuozopebu2017/09/17 02:58http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

oujemivahebeoujemivahebe2017/09/17 03:10http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

ofubumenawofubumenaw2017/09/17 03:11http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

iranagesoliranagesol2017/09/17 03:15http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

emupugixemupugix2017/09/17 03:28http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

oefaexuvavoefaexuvav2017/09/17 03:56http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

ufuhaysevufuhaysev2017/09/17 04:09http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

enelateenelate2017/09/17 12:34http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

aqasbonawaqaqasbonawaq2017/09/17 12:47http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

coaepoecoaepoe2017/09/17 17:08http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

olaebuvaxoolaebuvaxo2017/09/17 20:20http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

ieuhopebbaieuhopebba2017/09/17 22:55http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

uminwekgaobuminwekgaob2017/09/17 23:09http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

iluoifeoxinaxiluoifeoxinax2017/09/18 01:04http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

orsozuxrnaorsozuxrna2017/09/18 02:38http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

ikuziricikuziric2017/09/18 03:02http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

uqapufudomimuqapufudomim2017/09/25 13:11http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

ojuqepeojuqepe2017/09/25 13:20http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

axikuqiaxikuqi2017/09/25 13:24http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

uviltolecajuviltolecaj2017/09/25 13:33http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

ewdemiferoewdemifero2017/09/25 13:34http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/

uhicikijeseuhicikijese2017/09/25 14:13http://20mg-levitraforsale.com/ - 20mg-levitraforsale.com.ankor <a href="http://usbuy-ventolin.com/">usbuy-ventolin.com.ankor</a> http://generic-levitracheapest-price.com/