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
120
Property Based Testing introduction
Property Based Testing!
petitviolet
November 30, 2017
Tweet
Share
More Decks by petitviolet
See All by petitviolet
Stripeで請求書払い&銀行振込を実装する
petitviolet
0
1.4k
ピュアなドメインを支える技術/pure domain model and the technology behind it
petitviolet
14
10k
小さく始めるクラウドネイティブ/small start CloudNative
petitviolet
0
1.9k
2019年だからこそ12factor app/The Twelve-Factor app in 2019
petitviolet
1
1k
実践GraphQL on Scala/Real world GraphQL on Scala
petitviolet
8
3k
Kubernetesを知る/Introduction Kubernertes
petitviolet
1
640
GraphQL on Scala
petitviolet
3
2.6k
Microservices Batch on GAE
petitviolet
0
1.9k
Web API Design
petitviolet
18
8.3k
Other Decks in Programming
See All in Programming
Kubernetesで実現できるPlatform Engineering の現在地
nwiizo
3
1.9k
Rollupのビルド時間高速化によるプレビュー表示速度改善とバンドラとASTを駆使したプロダクト開発の難しさ
plaidtech
PRO
1
170
RuboCop: Modularity and AST Insights
koic
1
130
API for docs
soutaro
2
890
Enterprise Web App. Development (1): Build Tool Training Ver. 5
knakagawa
1
110
「影響が少ない」を自分の目でみてみる
o0h
PRO
2
1k
メモリウォールを超えて:キャッシュメモリ技術の進歩
kawayu
0
1.9k
Unlock the Potential of Swift Code Generation
rockname
0
240
PHPバージョンアップから始めるOSSコントリビュート / how2oss-contribute
dmnlk
1
1k
AIコードエディタの基盤となるLLMのFlutter性能評価
alquist4121
0
200
Going Structural with Named Tuples
bishabosha
0
200
AWS で実現する安全な AI エージェントの作り方 〜 Bedrock Engineer の実装例を添えて 〜 / how-to-build-secure-ai-agents
gawa
8
730
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.1k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
[RailsConf 2023] Rails as a piece of cake
palkan
54
5.4k
Become a Pro
speakerdeck
PRO
27
5.3k
GraphQLの誤解/rethinking-graphql
sonatard
71
10k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
StorybookのUI Testing Handbookを読んだ
zakiyama
29
5.6k
Speed Design
sergeychernyshev
29
890
Typedesign – Prime Four
hannesfritz
41
2.6k
Building Applications with DynamoDB
mza
94
6.3k
Optimizing for Happiness
mojombo
377
70k
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