Property Based Testing introduction

Property Based Testing introduction

Property Based Testing!

93bc8fb48f57c11e417dad9d26a2fb8a?s=128

petitviolet

November 30, 2017
Tweet

Transcript

  1. Property Based Testing のススメ @petitviolet 1 / 34

  2. みなさん、UT書いてますか? 2 / 34

  3. 調べてみましょう 3 / 34

  4. 書いてることにしておきましょう 4 / 34

  5. 正直めんどくさいですよね 5 / 34

  6. テストケース考えてテストデータ作るの、 めんどくさいですよね? 6 / 34

  7. Property Based Testing 7 / 34

  8. Property Based Testingって? テストデータをランダムに自動生成して、生成された値に対して条件を満たすかど うか判定するテスト。 8 / 34

  9. Property Based Testingって? テストデータをランダムに自動生成して、生成された値に対して条件を満たすかど うか判定するテスト。 普段JUnitとかScalaTestで書いているテストはExample Based Testingと呼ばれ るもの。 名前の通り、あるテストデータを用意してそれに対して条件を満たすかどうか判定

    するテストのこと。 9 / 34
  10. どんな感じ? 英字からなる文字列を自動生成したものと、それをreverseしてreverseしたもの が全て等しくなることをテストしている。 10 / 34

  11. どんな感じ? もうちょっとそれっぽい例。 この をテストしたい。 つまり、 は入力が0∼120の値なら でそうでないなら を返 すことをテストしたい。 11

    / 34
  12. Example Based Testingする まずはいつも通り書いてみるとこんな感じ。 成功 失敗

  13. ちょっとまとめてみるとこうなる。 成功 失敗 13 / 34

  14. Property Based Testingする 続いてPropertyBasedTestingなスタイルで書いてみるとこんな感じ。 14 / 34

  15. Property Based Testingする 続いてPropertyBasedTestingなスタイルで書いてみるとこんな感じ。 成功 失敗 何をしているかは何となく察せるはず。 に を与えて値を生成してテストしている。 15

    / 34
  16. わかりやすい...ですよね? 16 / 34

  17. Scalaだけ? 17 / 34

  18. Scalaだけ? そんなことはない Scala rickynils/scalacheck scalaprops/scalaprops Java pholser/junit‒quickcheck ncredinburgh/QuickTheories JavaScript jsverify/jsverify

    Elm TheSeamau5/elm‒check 各言語に何かしら実装があるので、何も無いことはないはず。 18 / 34
  19. 前準備 ScalaのPropertyBasedTestingフレームワークとして今回は rickynils/scalacheck: Property‒based testing for Scalaを使う。 19 / 34

  20. 依存の追加 既に例にもあったようにUTの一部としてPropertyBasedTestを記述できるように ScalaTestと併用する。 詳しくはScalaTestのドキュメントを参照。 build.sbtに以下を書く。 これで他のテスト(XxxSpec)を書きつつ、必要に応じてPropertyBasedTestを入 れていける。 20 / 34

  21. 必要なclass/traitをextendsする ScalaTestとScalaCheckを併用するために必要な準備。 今回はScalaCheckの を使ってデータ生成したいので、 をextendsしておく。 こんな感じになる。 21 / 34

  22. これで以下のようにテストを書ける。 すればSuccessするはず。 22 / 34

  23. いろんなものを生成してみる 実装はscalacheck/Gen.scalaを参照。 23 / 34

  24. 文字列の自動生成 まずはシンプルに文字列を生成して組み合わせてみる 英字 数字 生成 的 処理 24 / 34

  25. の自動生成 こんなのもある 生死絵 適当 25 / 34

  26. 電話番号を自動生成 と のあわせ技でやれる 式 合成 26 / 34

  27. 電話番号を自動生成 と のあわせ技でやれる 式 合成 こんな感じで生成される

  28. 決まった文字数の文字列を生成する パスワードって8文字‒30文字だったりする。 文字数 適当 選択 長 生成 28 / 34

  29. それっぽい例2 さっきの生成器を使ってパスワードのテストしてみる。 29 / 34

  30. テストを書く 文字 文字 文字 30 / 34

  31. なんとなく雰囲気伝わりましたか? 31 / 34

  32. 結局何が嬉しいのか データの生成を自動化出来る 生成のルールさえ記述すれば良い テストデータが1つ1つ正しいかどうかチェックしなくてよい 生成のルールさえ確認すれば良い 取りうる値に対する認識が深まる 生成ルールを作るためには境界条件を知っていないといけない 自動生成したデータに勝手に境界値が入ってくれる 結果としてドメインに対する理解も深まる 32

    / 34
  33. ぜひ使ってみて欲しい テストデータを自動生成してみるだけにでも使ってみる 普段のUT書くのがちょっと楽になるかも 少しずつデータの自動生成に詳しくなっていくと便利に使えるようになる 全て自動生成するのは限界だし結局大変 簡単にデータ生成できそうなところから置き換えていく 33 / 34

  34. Thank you! 34 / 34