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