$30 off During Our Annual Pro Sale. View Details »

Elm では、プログラムがあなたをテストする! #wejs / We Are JavaScripters 23rd

y_taka_23
August 21, 2018

Elm では、プログラムがあなたをテストする! #wejs / We Are JavaScripters 23rd

We Are JavaScripters! @23rd で使用したスライドです。Elm のプログラムに対してproperty-based test を行うためのライブラリ elm-test を紹介しました。特に、提供されているコンビネータを利用して、自作のデータ型のための Fuzzer を自在に組み立てることができるのが特徴です。

ちなみに、ブログ記事では Fuzzer の内部実装を含む詳しい解説が読めます。

イベント概要:https://wajs.connpass.com/event/96435/
ブログ記事:http://ccvanishing.hateblo.jp/entry/2018/08/23/211858

y_taka_23

August 21, 2018
Tweet

More Decks by y_taka_23

Other Decks in Technology

Transcript

  1. #wejs
    #wejs
    Elm では、プログラムが
    あなたをテストする!
    チェシャ猫 (@y_taka_23)
    We Are JavaScripters! @23rd (2018/08/21)

    View Slide

  2. #wejs
    #wejs
    テスト書いてる人?

    View Slide

  3. #wejs
    #wejs
    テスト「ケース」書いてる人?

    View Slide

  4. #wejs
    #wejs
    elm-test
    https://github.com/elm-community/elm-test

    View Slide

  5. #wejs
    #wejs

    View Slide

  6. #wejs
    #wejs
    elm-test による Fuzzing
    ● fuzz 関数でランダムデータを生成
    ○ いちいちテストケースを書かずに済む
    ○ データ型を変更しても書き直しにならない
    ● Property-based Testing
    ○ 引数 - 結果ではなく、関数が満たす性質を記述
    ○ 例:encode して decode すると元に戻る

    View Slide

  7. #wejs
    #wejs

    View Slide

  8. #wejs
    #wejs
    String だけでは実用性に欠ける?

    View Slide

  9. #wejs
    #wejs
    Fuzzer のカスタマイズ
    ● 自作データ型のランダム生成
    ○ 基本的な Fuzzer を組み立てて作る
    ○ 入れ子になったデータ型も扱える
    ● 複雑な条件に従う Fuzzer も作成可能
    ○ Fuzzer 用の部品(コンビネータ)を提供
    ○ 例:oneOf, constant, intRange

    View Slide

  10. #wejs
    #wejs

    View Slide

  11. #wejs
    #wejs

    View Slide

  12. #wejs
    #wejs
    ランダムだと無駄が多いのでは?

    View Slide

  13. #wejs
    #wejs
    Fuzzer の構成要素
    ● Generator
    ○ frequency 関数で生成の内訳を操作できる
    ○ コーナーケースになりやすい値を多めに生成
    ● Shrinker
    ○ もっと小さい反例を探すための戦略を定義
    ○ Fail が検出されると再帰的に呼び出される

    View Slide

  14. #wejs
    #wejs

    View Slide

  15. #wejs
    #wejs
    まとめ
    ● elm-test の Fuzz モジュール
    ○ テストケースを書かなくとも自動で生成
    ● コンビネータとしての Fuzzer
    ○ ランダムデータの「組み立て」が可能
    ● 反例を効率的に探すための仕組み
    ○ Generator と Shrinker でコーナーケースを生成

    View Slide

  16. #wejs
    #wejs
    Have a Nice Fuzzer!
    Presented by チェシャ猫 (@y_taka_23)

    View Slide