QuickCheck
導入
package.yamlのdependenciesにQuickCheckを追記
大文字小文字はこのままなので注意
コード例
code: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.icon
code:hs
prop_hoge :: Positive Int -> Bool
prop_hoge x = hoge x == hogehoge x
こんなテストを書くときに、hoge :: Int -> Stringとかだったら、hogeはPositive Intを引数に取れなくてエラー出るじゃん
code:こうする.hs
prop_hoge (Positive x) = hoge x == hogehoge x
自作型のテストをする
型クラスのinstanceにする
関数の生成もある
実装するときのコツ
一般的なテストコードのような関数のユースケースを示すのとは少し違うので、
ちょっとしたコツみたいなのが必要になる気がする
関数のユースケースではなく、関数の性質をテストする
逆射のような関数が必要になったりするmrsekut.icon
これはこれでむずい
どういう頭の使い方をするのが良いかメモっておこうmrsekut.icon
(code.decode) x == xとすることで諸々のテストができた
hspecがないと動かない、実行したら一緒に実行される、完全に独立、など
Test.Hspec.QuickCheckはなに?
Test.QuickCheckとの違いは?
実装について
参考
導入からいろいろ親切な記事。忘れてたらこれを読もう
sample, sample', arbitrary