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
ランダムに振る舞う機能を JUnit する #渋谷Java 第3回
Search
KOMIYA Atsushi
September 28, 2013
Technology
9
5.6k
ランダムに振る舞う機能を JUnit する #渋谷Java 第3回
第3回 #渋谷Java の発表資料です。ランダムに振る舞う機能を、どのように JUnit でテストできるようにするかを記載しています。
http://atnd.org/events/42501
KOMIYA Atsushi
September 28, 2013
Tweet
Share
More Decks by KOMIYA Atsushi
See All by KOMIYA Atsushi
#JJUG Java における乱数生成器とのつき合い方
komiya_atsushi
5
5.3k
#JJUG Fork/Join フレームワークを効率的に正しく使いたい
komiya_atsushi
0
510
[#JSUG] SmartNews における container friendly な Spring Boot アプリケーション開発
komiya_atsushi
1
11k
Java のデータ圧縮ライブラリを極める #jjug_ccc #ccc_c7
komiya_atsushi
4
5k
#devsumi 自然言語処理・機械学習によるファクトチェック業務の支援
komiya_atsushi
1
4.5k
SmartNews Ads における機械学習の活用とその運用 #mlops
komiya_atsushi
3
19k
GBDT によるクリック率予測を高速化したい #オレシカナイト vol.4
komiya_atsushi
5
1.3k
Maven central repository の artifact をランキングする #渋谷java
komiya_atsushi
0
1.4k
確率的データ構造を Java で扱いたい! #JJUG
komiya_atsushi
6
2.3k
Other Decks in Technology
See All in Technology
助けて! XからWaylandに移行しないと新しいGNOMEが使えなくなっちゃう 2025-07-12
nobutomurata
2
140
Operating Operator
shhnjk
1
650
Copilot coding agentにベットしたいCTOが開発組織で取り組んだこと / GitHub Copilot coding agent in Team
tnir
0
150
20250708オープンエンドな探索と知識発見
sakana_ai
PRO
4
880
Lufthansa ®️ USA Contact Numbers: Complete 2025 Support Guide
lufthanahelpsupport
0
250
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
500
Rethinking Incident Response: Context-Aware AI in Practice
rrreeeyyy
1
420
american airlines®️ USA Contact Numbers: Complete 2025 Support Guide
supportflight
1
120
【LT会登壇資料】TROCCO新コネクタ「スマレジ」を活用した直営店データの分析
kazari0425
1
170
QuickSight SPICE の効果的な運用戦略~S3 + Athena 構成での実践ノウハウ~/quicksight-spice-s3-athena-best-practices
emiki
0
260
NewSQLや分散データベースを支えるRaftの仕組み - 仕組みを理解して知る得意不得意
hacomono
PRO
3
230
「クラウドコスト絶対削減」を支える技術—FinOpsを超えた徹底的なクラウドコスト削減の実践論
delta_tech
4
190
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
The Language of Interfaces
destraynor
158
25k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Producing Creativity
orderedlist
PRO
346
40k
How GitHub (no longer) Works
holman
314
140k
4 Signs Your Business is Dying
shpigford
184
22k
Six Lessons from altMBA
skipperchong
28
3.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Raft: Consensus for Rubyists
vanstee
140
7k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
Transcript
ランダムに 振る舞う機能を JUnit する 渋⾕谷Java #3 2013.9.28 at BizReach
KOMIYA Atsushi ( @komiya_atsushi )
by batigolix http://www.flickr.com/photos/batigolix/925301391/ イントロダクション 2
KOMIYA Atsushi @komiya_atsushi 3
分析⼒力力をコアとする マーケティングソリューションカンパニー レコメンデーション&機械学習系 Java エンジニア 4
分析⼒力力をコアとする マーケティングソリューションカンパニー レコメンデーション&機械学習系 Java エンジニア 代々⽊木の緑⾊色の会社 5
#TokyoWebmining 事務局 分析/機械学習/アドテク等のネタで お話していただける講師を募集中デス! 6
by Sebastian Bergmann http://www.flickr.com/photos/sebastian_bergmann/8127016855/ みなさん、 JUnit してますか? 7
今⽇日のお話 • 動機 • Random#nextInt() などで得られる乱数に 従って振る舞い、出⼒力力が決まる機能を JUnit でテストしたい • でも、普通に JUnit
を使っただけでは結果 が不不定なテストとなってしまう… 8
今⽇日のお話 • 動機 • Random#nextInt() などで得られる乱数に 従って振る舞い、出⼒力力が決まる機能を JUnit でテストしたい • でも、普通に JUnit
を使っただけでは結果 が不不定なテストとなってしまう… データサイエンスを⽣生業としている企業らしく… 統計的な⼿手法を 使って解決しよう! 9
今回対象とするランダムに振る舞う機能 • 前提条件 1. 1回の試⾏行行につき発⽣生する事象が1つで あること • 試⾏行行:機能を実⾏行行して何らかの結果を 得ようとする⾏行行為 • 事象:出⼒力力される・得られる値
2. 事象は離離散値でかつ種類数が有限個数で あること 3. 事象の⽣生起確率率率が事前に明らかである・ 推定できること 10
今回対象とするランダムに振る舞う機能 • 前提条件 • 1回の試⾏行行につき発⽣生する事象が1つで あること • 試⾏行行:機能を実⾏行行して何らかの結果を 得ようとする⾏行行為 • 事象:出⼒力力される・得られる値 • 事象は離離散値でかつ種類数が有限個数で
あること • 事象の⽣生起確率率率が事前に明らかである・ 推定できること 早い話が、 「コイントスする」 「サイコロを振る」 に相当する機能と思えばOK 11
by Bartmani http://www.flickr.com/photos/8349201@N04/503039124/ いかにしてランダムな 振る舞いをする機能を ユニットテスト するか? 12
ユニットテストへの統計学的アプローチ • 推計統計学における「仮説検定」の考え⽅方 を利利⽤用する • コイントスによる仮説検定の例例 (⼆二項検定) • 「コイントスを 20 回試してみたんだけど、 表が
15 回も出たんだよね。このコインって、 歪んでる(1/2の確率率率じゃない)のかな?」 • 「歪んでないコインと仮定した場合、20 回 コイントスしてたまたま表が 15 回出る確率率率は 5% 以下(4.139%)だよ〜~? だから、5% の 確率率率で間違いかもしれないけど歪んでいると ⾔言えそうだねっ!」 13
ユニットテストへの統計学的アプローチ • 推計統計学における「仮説検定」の考え⽅方 を利利⽤用する • コイントスによる仮説検定の例例 (⼆二項検定) • 「コイントスを 20 回試してみたんだけど、 表が
15 回も出たんだよね。このコインって、 歪んでる(1/2の確率率率じゃない)のかな?」 • 「歪んでないコインと仮定した場合、20 回 コイントスしてたまたま表が 15 回出る確率率率は 5% 以下(4.139%)だよ〜~? だから、5% の 確率率率で間違いかもしれないけど歪んでいると ⾔言えそうだねっ!」 100% の精度度ではない 14
ユニットテストへの統計学的アプローチ • 推計統計学における「仮説検定」の考え⽅方 を利利⽤用する • コイントスによる仮説検定の例例 (⼆二項検定) • 「コイントスを 20 回試してみたんだけど、 表が
15 回も出たんだよね。このコインって、 歪んでる(1/2の確率率率じゃない)のかな?」 • 「歪んでないコインと仮定した場合、20 回 コイントスしてたまたま表が 15 回出る確率率率は 5% 以下(4.139%)だよ〜~? だから、5% の 確率率率で間違いかもしれないけど歪んでいると ⾔言えそうだねっ!」 試⾏行行回数 p 値 有意⽔水準 15
ユニットテストに応⽤用する • テスト対象の機能によって得られる事象 (出⼒力力結果)の⽣生起確率率率が、想定してい る確率率率に近しいことを検証する • 例例 • 60% の確率率率で “晴れ” を、 25%
の確率率率で “曇り” を、 15% の確率率率で “⾬雨” を返すメソッド String weather() をテストしたい! 16
ユニットテストに応⽤用する • 例例 • 60% の確率率率で “晴れ” を、 25% の確率率率で “曇り” を、
15% の確率率率で “⾬雨” を返すメソッド String weather() をテストしたい! • 100 回呼び出したときの各事象の頻度度 事象 推定値 [回] 観測値 [回] 晴れ 100 * 0.60 = 60 55 曇り 100 * 0.25 = 25 27 ⾬雨 100 * 0.15 = 15 18 17
ユニットテストに応⽤用する • 例例 • 60% の確率率率で “晴れ” を、 25% の確率率率で “曇り” を、
15% の確率率率で “⾬雨” を返すメソッド String weather() をテストしたい! • 100 回呼び出したときの各事象の頻度度 事象 推定値 [回] 観測値 [回] 晴れ 100 * 0.60 = 60 55 曇り 100 * 0.25 = 25 27 ⾬雨 100 * 0.15 = 15 18 この「ずれ」は 果たして妥当 なのだろうか? 18
具体的な仮説検定の⼿手法:カイ⼆二乗検定 • カイ⼆二乗検定による適合度度検定 • 試⾏行行した・観測した結果得られた、各事象 の頻度度の分布が想定・推定される頻度度の分 布とどれだけ近しいか? を確認する 19
具体的な仮説検定の⼿手法:カイ⼆二乗検定 • カイ⼆二乗検定による適合度度検定 • 試⾏行行した・観測した結果得られた、各事象 の頻度度の分布が想定・推定される頻度度の分 布とどれだけ近しいか? を確認する ずれっぷりが 妥当なのかを 判断できる! 20
ユニットテストの 観点で仮説検定を ⾒見見ていきます 21
仮説検定の注意点 • 「想定される状況からずれていること」 を積極的に⽰示したい動機が背景にある • 医療療などの⽅方⾯面で特に顕著 • ユニットテストの場合は 「想定からずれていないこと」、 すなわち OK であることを⽰示したい • 「有意⽔水準」など、⾔言葉葉の意味が「逆」に
思えるケースがあるので要注意 22
仮説検定を利利⽤用したユニットテストの検出精度度 偽陽性と偽陰性 • 先に述べた通り、仮説検定の精度度は 100% ではない • ユニットテストにおける偽陽性・偽陰性を考えてみよ う • 偽陽性(第⼀一種過誤、False positive) • OK
と判定されるテストケースが、実⾏行行の結果、誤って NG として検出されてしまう状況(誤検知) • 偽陰性(第⼆二種過誤、False negative) • 偽陽性とは逆に、NG として検出されるべき テストケースが OK 判定になる状況(バグ検出漏漏れ) • 両⽅方ともに少ない状況が望ましい • 状況によっては、偽陰性がより重視されることも 23
有意⽔水準 • NG を検出する精度度を左右する重要な要素 • ⼀一般的な仮説検定では 5% or 1% とする • ユニットテストにおいて、有意⽔水準を • ⼤大きくする
• J NG 結果の検知漏漏れは減る • L OK → NG の誤検知が増える • ⼩小さくする • J OK → NG の誤検知は減る • L NG 結果の検知漏漏れが増える 24
試⾏行行回数 • 「サイコロを振る回数」 「コイントスする回数」に相当する • 回数が多ければ多いほど、得られた 判定結果の信ぴょう性が増してくる • 事象の数(≒⾃自由度度)が⼤大きい場合は、 試⾏行行回数も多めに設定する必要がある • L スローテスト問題が起きやすくなる 25
by marissa http://www.flickr.com/photos/44124363951@N01/4369776892/ 実装 26
実装に関する疑問 • 理理屈はなんとなくわかったよ、だから コードを⾒見見せろ! • カイ⼆二乗検定なんてどう実装すりゃいい ねん… • これ本当に JUnit で扱えるの…? 27
実装に関する疑問 • カイ⼆二乗検定関係 • JUnit での利利⽤用 • BaseMatcher を継承したクラスを⽤用意 28
実装に関する疑問 • カイ⼆二乗検定関係 • JUnit での利利⽤用 • BaseMatcher を継承したクラスを⽤用意 gist.github.com/komiya-‐atsushi/6736271 29
使い⽅方 // 試⾏行行により観測された各事象の回数 long[] counts = {55, 27, 18};
// 期待される各事象の⽣生起確率率率 double[] probs = {0.60, 0.25, 0.15}; // 有意⽔水準 double significanceLevel = 0.05; // assertion は次のように書く assertThat( observedCounts(counts), // 観測された各事象の回数 wellFit(probs) // 期待される確率率率 .at(significanceLevel)); // 有意⽔水準 30
ちょっとした デモ 31
まとめ • ランダムな振る舞いを持って出⼒力力をする 機能も ユニットテストできるんだよ • そう、カイ⼆二乗検定ならね • BaseMatcher 継承して実装すれば、 JUnit からも使えるよ! • ただ利利⽤用するにはちょっと統計の知識識が
必要ネ • 有意⽔水準、⾃自由度度、試⾏行行回数… 32
ありがとう ございました! 33