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

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

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-test による Fuzzing • fuzz 関数でランダムデータを生成 ◦ いちいちテストケースを書かずに済む

    ◦ データ型を変更しても書き直しにならない • Property-based Testing ◦ 引数 - 結果ではなく、関数が満たす性質を記述 ◦ 例:encode して decode すると元に戻る
  2. #wejs #wejs Fuzzer のカスタマイズ • 自作データ型のランダム生成 ◦ 基本的な Fuzzer を組み立てて作る

    ◦ 入れ子になったデータ型も扱える • 複雑な条件に従う Fuzzer も作成可能 ◦ Fuzzer 用の部品(コンビネータ)を提供 ◦ 例:oneOf, constant, intRange
  3. #wejs #wejs Fuzzer の構成要素 • Generator ◦ frequency 関数で生成の内訳を操作できる ◦

    コーナーケースになりやすい値を多めに生成 • Shrinker ◦ もっと小さい反例を探すための戦略を定義 ◦ Fail が検出されると再帰的に呼び出される
  4. #wejs #wejs まとめ • elm-test の Fuzz モジュール ◦ テストケースを書かなくとも自動で生成

    • コンビネータとしての Fuzzer ◦ ランダムデータの「組み立て」が可能 • 反例を効率的に探すための仕組み ◦ Generator と Shrinker でコーナーケースを生成