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
140
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
11k
小さく始めるクラウドネイティブ/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
670
GraphQL on Scala
petitviolet
3
2.8k
Microservices Batch on GAE
petitviolet
0
2k
Web API Design
petitviolet
18
8.6k
Other Decks in Programming
See All in Programming
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
180
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
130
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
410
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
370
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
CSC307 Lecture 02
javiergs
PRO
1
770
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
1.3k
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
180
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
3
860
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
260
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
830
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
51
Bash Introduction
62gerente
615
210k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
59
42k
Designing for humans not robots
tammielis
254
26k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
60
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
150
Tell your own story through comics
letsgokoyo
1
800
Embracing the Ebb and Flow
colly
88
5k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
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