Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Property Based Testing introduction

Property Based Testing introduction

Property Based Testing!

petitviolet

November 30, 2017
Tweet

More Decks by petitviolet

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. Property Based Testing
    7 / 34

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. Scalaだけ?
    17 / 34

    View Slide

  18. Scalaだけ?
    そんなことはない
    Scala
    rickynils/scalacheck
    scalaprops/scalaprops
    Java
    pholser/junit‒quickcheck
    ncredinburgh/QuickTheories
    JavaScript
    jsverify/jsverify
    Elm
    TheSeamau5/elm‒check
    各言語に何かしら実装があるので、何も無いことはないはず。
    18 / 34

    View Slide

  19. 前準備
    ScalaのPropertyBasedTestingフレームワークとして今回は
    rickynils/scalacheck: Property‒based testing for Scalaを使う。
    19 / 34

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. Thank you!
    34 / 34

    View Slide