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