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
1
130
Property Based Testing introduction
Property Based Testing!
petitviolet
November 30, 2017
Tweet
Share
More Decks by petitviolet
See All by petitviolet
Stripeで請求書払い&銀行振込を実装する
petitviolet
1
1.6k
ピュアなドメインを支える技術/pure domain model and the technology behind it
petitviolet
14
10k
小さく始めるクラウドネイティブ/small start CloudNative
petitviolet
0
2k
2019年だからこそ12factor app/The Twelve-Factor app in 2019
petitviolet
1
1k
実践GraphQL on Scala/Real world GraphQL on Scala
petitviolet
8
3.2k
Kubernetesを知る/Introduction Kubernertes
petitviolet
1
660
GraphQL on Scala
petitviolet
3
2.7k
Microservices Batch on GAE
petitviolet
0
2k
Web API Design
petitviolet
18
8.5k
Other Decks in Programming
See All in Programming
予防に勝る防御なし(2025年版) - 堅牢なコードを導く様々な設計のヒント / Growing Reliable Code PHP Conference Fukuoka 2025
twada
PRO
36
11k
なぜ強調表示できず ** が表示されるのか — Perlで始まったMarkdownの歴史と日本語文書における課題
kwahiro
8
5.1k
知られているようで知られていない JavaScriptの仕様 4選
syumai
0
500
アーキテクチャと考える迷子にならない開発者テスト
irof
5
1.6k
詳細の決定を遅らせつつ実装を早くする
shimabox
1
990
Amazon Bedrock Knowledge Bases Hands-on
konny0311
0
140
flutter_kaigi_2025.pdf
kyoheig3
1
210
HTTPじゃ遅すぎる! SwitchBotを自作ハブで動かして学ぶBLE通信
occhi
0
230
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
440
外接に惑わされない自システムの処理時間SLIをOpenTelemetryで実現した話
kotaro7750
0
240
CSC509 Lecture 13
javiergs
PRO
0
240
Kotlinで実装するCPU/GPU 「協調的」パフォーマンス管理
matuyuhi
0
370
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Producing Creativity
orderedlist
PRO
348
40k
YesSQL, Process and Tooling at Scale
rocio
174
15k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Designing for Performance
lara
610
69k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
How to Ace a Technical Interview
jacobian
280
24k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
920
Agile that works and the tools we love
rasmusluckow
331
21k
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