Property Based Testing!
Property Based Testingのススメ@petitviolet1 / 34
View Slide
みなさん、UT書いてますか?2 / 34
調べてみましょう3 / 34
書いてることにしておきましょう4 / 34
正直めんどくさいですよね5 / 34
テストケース考えてテストデータ作るの、めんどくさいですよね?6 / 34
Property Based Testing7 / 34
Property Based Testingって?テストデータをランダムに自動生成して、生成された値に対して条件を満たすかどうか判定するテスト。8 / 34
Property Based Testingって?テストデータをランダムに自動生成して、生成された値に対して条件を満たすかどうか判定するテスト。普段JUnitとかScalaTestで書いているテストはExample Based Testingと呼ばれるもの。名前の通り、あるテストデータを用意してそれに対して条件を満たすかどうか判定するテストのこと。9 / 34
どんな感じ?英字からなる文字列を自動生成したものと、それをreverseしてreverseしたものが全て等しくなることをテストしている。10 / 34
どんな感じ?もうちょっとそれっぽい例。この をテストしたい。つまり、 は入力が0∼120の値なら でそうでないなら を返すことをテストしたい。11 / 34
Example Based Testingするまずはいつも通り書いてみるとこんな感じ。成功失敗
ちょっとまとめてみるとこうなる。成功失敗13 / 34
Property Based Testingする続いてPropertyBasedTestingなスタイルで書いてみるとこんな感じ。14 / 34
Property Based Testingする続いてPropertyBasedTestingなスタイルで書いてみるとこんな感じ。成功失敗何をしているかは何となく察せるはず。に を与えて値を生成してテストしている。15 / 34
わかりやすい...ですよね?16 / 34
Scalaだけ?17 / 34
Scalaだけ?そんなことはないScalarickynils/scalacheckscalaprops/scalapropsJavapholser/junit‒quickcheckncredinburgh/QuickTheoriesJavaScriptjsverify/jsverifyElmTheSeamau5/elm‒check各言語に何かしら実装があるので、何も無いことはないはず。18 / 34
前準備ScalaのPropertyBasedTestingフレームワークとして今回はrickynils/scalacheck: Property‒based testing for Scalaを使う。19 / 34
依存の追加既に例にもあったようにUTの一部としてPropertyBasedTestを記述できるようにScalaTestと併用する。詳しくはScalaTestのドキュメントを参照。build.sbtに以下を書く。これで他のテスト(XxxSpec)を書きつつ、必要に応じてPropertyBasedTestを入れていける。20 / 34
必要なclass/traitをextendsするScalaTestとScalaCheckを併用するために必要な準備。今回はScalaCheckの を使ってデータ生成したいので、をextendsしておく。こんな感じになる。21 / 34
これで以下のようにテストを書ける。すればSuccessするはず。22 / 34
いろんなものを生成してみる実装はscalacheck/Gen.scalaを参照。23 / 34
文字列の自動生成まずはシンプルに文字列を生成して組み合わせてみる英字 数字 生成的 処理24 / 34
の自動生成こんなのもある生死絵適当25 / 34
電話番号を自動生成と のあわせ技でやれる式 合成26 / 34
電話番号を自動生成と のあわせ技でやれる式 合成こんな感じで生成される
決まった文字数の文字列を生成するパスワードって8文字‒30文字だったりする。文字数 適当 選択長 生成28 / 34
それっぽい例2さっきの生成器を使ってパスワードのテストしてみる。29 / 34
テストを書く文字文字文字30 / 34
なんとなく雰囲気伝わりましたか?31 / 34
結局何が嬉しいのかデータの生成を自動化出来る生成のルールさえ記述すれば良いテストデータが1つ1つ正しいかどうかチェックしなくてよい生成のルールさえ確認すれば良い取りうる値に対する認識が深まる生成ルールを作るためには境界条件を知っていないといけない自動生成したデータに勝手に境界値が入ってくれる結果としてドメインに対する理解も深まる32 / 34
ぜひ使ってみて欲しいテストデータを自動生成してみるだけにでも使ってみる普段のUT書くのがちょっと楽になるかも少しずつデータの自動生成に詳しくなっていくと便利に使えるようになる全て自動生成するのは限界だし結局大変簡単にデータ生成できそうなところから置き換えていく33 / 34
Thank you!34 / 34