QuickCheck
Property based testingをする
docs
代表的な関数の紹介 ref
導入
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個のランダム値でテストされる
エラー時に表示されるものは、失敗時の引数
何のためのExistentialQuantification #??
Float同士の演算は結合律を満たさない
値の生成
https://haskell.e-bigmoon.com/stack/test/quickcheck.html
sample
サンプル値を生成し、それらをstdoutに出力
sample'
arbitrary
choose
elements
oneof
frequency
suchThat
listOf, listOf1
vectorOf
shuffle
vector
orderedList
テスト実施
prop
自然数のみとかどうする #??
https://haskell.e-bigmoon.com/stack/test/quickcheck2.html
自然数の限定する方法
Positive型を利用する
https://haskell.e-bigmoon.com/stack/test/quickcheck2.html
普通の関数に適用できなくなるじゃん!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にする
https://stackoverflow.com/questions/35726256/quickcheck-on-custom-datatype
http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html
http://geekyplatypus.com/y-u-have-no-code-samples-quickcheck/
関数の生成もある
https://hackage.haskell.org/package/QuickCheck-2.11.3/docs/Test-QuickCheck-Function.html
ここでみた
実装するときのコツ
一般的なテストコードのような関数のユースケースを示すのとは少し違うので、
ちょっとしたコツみたいなのが必要になる気がする
関数のユースケースではなく、関数の性質をテストする
逆射のような関数が必要になったりするmrsekut.icon
これはこれでむずい
どういう頭の使い方をするのが良いかメモっておこうmrsekut.icon
comp.hsの仕様を作るときは、codeとdecodeのような逆射の関数ができたので
(code.decode) x == xとすることで諸々のテストができた
#??
hspecとの関係性は?
hspecがないと動かない、実行したら一緒に実行される、完全に独立、など
Test.Hspec.QuickCheckはなに?
Test.QuickCheckとの違いは?
実装について
QuickCheck:A Lightweight Tool for Random Testing of Haskell Programs
pdf
参考
【基礎】ランダムテスト (QuickCheck)
導入からいろいろ親切な記事。忘れてたらこれを読もう
sample, sample', arbitrary
https://haskell.e-bigmoon.com/stack/test/quickcheck2.html
/mrsekut-book-4274068056/034 (第2章 仕様に基づくテスト)
http://yunomu.hatenablog.jp/entry/2012/12/11/230424
https://qiita.com/waddlaw/items/49874f4cf9b680e4b015#quickcheck
http://a-kawashiro.hatenablog.com/entry/2018/12/25/222558
https://xtech.nikkei.com/it/article/COLUMN/20080304/295346/
https://xtech.nikkei.com/it/article/COLUMN/20080408/298292/
https://blog.miz-ar.info/2020/08/debugging-with-quickcheck/