QuickCheck
導入
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
型を利用する
普通の関数に適用できなくなるじゃん!

hsprop_hoge :: Positive Int -> Bool
prop_hoge x = hoge x == hogehoge x
こんなテストを書くときに、 hoge :: Int -> String
とかだったら、 hoge
は Positive Int
を引数に取れなくてエラー出るじゃん
こうする.hsprop_hoge (Positive x) = hoge x == hogehoge x
自作型のテストをする
型クラスのinstanceにする
関数の生成もある
実装するときのコツ
一般的なテストコードのような関数のユースケースを示すのとは少し違うので、
ちょっとしたコツみたいなのが必要になる気がする
関数のユースケースではなく、関数の性質をテストする
逆射のような関数が必要になったりする

これはこれでむずい
どういう頭の使い方をするのが良いかメモっておこう

(code.decode) x == x
とすることで諸々のテストができた
hspecがないと動かない、実行したら一緒に実行される、完全に独立、など
Test.Hspec.QuickCheckはなに?
Test.QuickCheckとの違いは?
実装について
参考
導入からいろいろ親切な記事。忘れてたらこれを読もう
sample
, sample'
, arbitrary