generated at
QuickCheck

代表的な関数の紹介 ref

導入
package.yaml のdependenciesに QuickCheck を追記
大文字小文字はこのままなので注意


コード例
hs
{-# LANGUAGE ExistentialQuantification #-} import Test.QuickCheck prop_PlusAssociative :: Integer -> Integer -> Integer -> Bool prop_PlusAssociative x y z = (x + y) + z == x + (y + z) prop_PlusAssociative' :: Float -> Float -> Float -> Bool prop_PlusAssociative' x y z = (x + y) + z == x + (y + z) main = do quickCheck PlusAssociative -- テストに通る quickCheck PlusAssociative' -- Floatは結合律を満たさないので失敗する
100個のランダム値でテストされる
エラー時に表示されるものは、失敗時の引数


値の生成
sample
サンプル値を生成し、それらをstdoutに出力
sample'
arbitrary
choose
elements
oneof
frequency
suchThat
listOf, listOf1
vectorOf
shuffle
vector
orderedList

テスト実施
prop
自然数のみとかどうする #??


自然数の限定する方法
Positive 型を利用する
普通の関数に適用できなくなるじゃん!mrsekut
hs
prop_hoge :: Positive Int -> Bool prop_hoge x = hoge x == hogehoge x
こんなテストを書くときに、 hoge :: Int -> String とかだったら、 hoge Positive Int を引数に取れなくてエラー出るじゃん
こうする.hs
prop_hoge (Positive x) = hoge x == hogehoge x



自作型のテストをする
型クラスのinstanceにする


関数の生成もある
ここでみた

実装するときのコツ
一般的なテストコードのような関数のユースケースを示すのとは少し違うので、
ちょっとしたコツみたいなのが必要になる気がする
関数のユースケースではなく、関数の性質をテストする
逆射のような関数が必要になったりするmrsekut
これはこれでむずい
どういう頭の使い方をするのが良いかメモっておこうmrsekut
comp.hsの仕様を作るときは、 code decode のような逆射の関数ができたので
(code.decode) x == x とすることで諸々のテストができた



hspecとの関係性は?
hspecがないと動かない、実行したら一緒に実行される、完全に独立、など
Test.Hspec.QuickCheckはなに?
Test.QuickCheckとの違いは?


実装について



参考
導入からいろいろ親切な記事。忘れてたらこれを読もう
sample , sample' , arbitrary