Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

#wejs #wejs

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

#wejs #wejs

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

#wejs #wejs

Slide 11

Slide 11 text

#wejs #wejs

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

#wejs #wejs

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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