Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Property Based Testing introduction
Search
petitviolet
November 30, 2017
Programming
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Property Based Testing introduction
Property Based Testing!
petitviolet
November 30, 2017
More Decks by petitviolet
See All by petitviolet
Stripeで請求書払い&銀行振込を実装する
petitviolet
1
1.7k
ピュアなドメインを支える技術/pure domain model and the technology behind it
petitviolet
14
11k
小さく始めるクラウドネイティブ/small start CloudNative
petitviolet
0
2.2k
2019年だからこそ12factor app/The Twelve-Factor app in 2019
petitviolet
1
1.1k
実践GraphQL on Scala/Real world GraphQL on Scala
petitviolet
8
3.4k
Kubernetesを知る/Introduction Kubernertes
petitviolet
1
700
GraphQL on Scala
petitviolet
3
2.9k
Microservices Batch on GAE
petitviolet
0
2k
Web API Design
petitviolet
18
8.7k
Other Decks in Programming
See All in Programming
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
330
どこまでゆるくて許されるのか
tk3fftk
0
490
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
150
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
190
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
500
フィードバックで育てるAI開発
kotaminato
1
120
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
490
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
850
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
140
AIエージェントで 変わるAndroid開発環境
takahirom
2
660
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Side Projects
sachag
455
43k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
350
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Crafting Experiences
bethany
1
220
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
380
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
Speed Design
sergeychernyshev
33
1.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Transcript
Property Based Testing のススメ @petitviolet 1 / 34
みなさん、UT書いてますか? 2 / 34
調べてみましょう 3 / 34
書いてることにしておきましょう 4 / 34
正直めんどくさいですよね 5 / 34
テストケース考えてテストデータ作るの、 めんどくさいですよね? 6 / 34
Property Based Testing 7 / 34
Property Based Testingって? テストデータをランダムに自動生成して、生成された値に対して条件を満たすかど うか判定するテスト。 8 / 34
Property Based Testingって? テストデータをランダムに自動生成して、生成された値に対して条件を満たすかど うか判定するテスト。 普段JUnitとかScalaTestで書いているテストはExample Based Testingと呼ばれ るもの。 名前の通り、あるテストデータを用意してそれに対して条件を満たすかどうか判定
するテストのこと。 9 / 34
どんな感じ? 英字からなる文字列を自動生成したものと、それをreverseしてreverseしたもの が全て等しくなることをテストしている。 10 / 34
どんな感じ? もうちょっとそれっぽい例。 この をテストしたい。 つまり、 は入力が0∼120の値なら でそうでないなら を返 すことをテストしたい。 11
/ 34
Example Based Testingする まずはいつも通り書いてみるとこんな感じ。 成功 失敗
ちょっとまとめてみるとこうなる。 成功 失敗 13 / 34
Property Based Testingする 続いてPropertyBasedTestingなスタイルで書いてみるとこんな感じ。 14 / 34
Property Based Testingする 続いてPropertyBasedTestingなスタイルで書いてみるとこんな感じ。 成功 失敗 何をしているかは何となく察せるはず。 に を与えて値を生成してテストしている。 15
/ 34
わかりやすい...ですよね? 16 / 34
Scalaだけ? 17 / 34
Scalaだけ? そんなことはない Scala rickynils/scalacheck scalaprops/scalaprops Java pholser/junit‒quickcheck ncredinburgh/QuickTheories JavaScript jsverify/jsverify
Elm TheSeamau5/elm‒check 各言語に何かしら実装があるので、何も無いことはないはず。 18 / 34
前準備 ScalaのPropertyBasedTestingフレームワークとして今回は rickynils/scalacheck: Property‒based testing for Scalaを使う。 19 / 34
依存の追加 既に例にもあったようにUTの一部としてPropertyBasedTestを記述できるように ScalaTestと併用する。 詳しくはScalaTestのドキュメントを参照。 build.sbtに以下を書く。 これで他のテスト(XxxSpec)を書きつつ、必要に応じてPropertyBasedTestを入 れていける。 20 / 34
必要なclass/traitをextendsする ScalaTestとScalaCheckを併用するために必要な準備。 今回はScalaCheckの を使ってデータ生成したいので、 をextendsしておく。 こんな感じになる。 21 / 34
これで以下のようにテストを書ける。 すればSuccessするはず。 22 / 34
いろんなものを生成してみる 実装はscalacheck/Gen.scalaを参照。 23 / 34
文字列の自動生成 まずはシンプルに文字列を生成して組み合わせてみる 英字 数字 生成 的 処理 24 / 34
の自動生成 こんなのもある 生死絵 適当 25 / 34
電話番号を自動生成 と のあわせ技でやれる 式 合成 26 / 34
電話番号を自動生成 と のあわせ技でやれる 式 合成 こんな感じで生成される
決まった文字数の文字列を生成する パスワードって8文字‒30文字だったりする。 文字数 適当 選択 長 生成 28 / 34
それっぽい例2 さっきの生成器を使ってパスワードのテストしてみる。 29 / 34
テストを書く 文字 文字 文字 30 / 34
なんとなく雰囲気伝わりましたか? 31 / 34
結局何が嬉しいのか データの生成を自動化出来る 生成のルールさえ記述すれば良い テストデータが1つ1つ正しいかどうかチェックしなくてよい 生成のルールさえ確認すれば良い 取りうる値に対する認識が深まる 生成ルールを作るためには境界条件を知っていないといけない 自動生成したデータに勝手に境界値が入ってくれる 結果としてドメインに対する理解も深まる 32
/ 34
ぜひ使ってみて欲しい テストデータを自動生成してみるだけにでも使ってみる 普段のUT書くのがちょっと楽になるかも 少しずつデータの自動生成に詳しくなっていくと便利に使えるようになる 全て自動生成するのは限界だし結局大変 簡単にデータ生成できそうなところから置き換えていく 33 / 34
Thank you! 34 / 34