$30 off During Our Annual Pro Sale. View Details »

ランダムに振る舞う機能を JUnit する #渋谷Java 第3回

KOMIYA Atsushi
September 28, 2013

ランダムに振る舞う機能を JUnit する #渋谷Java 第3回

第3回 #渋谷Java の発表資料です。ランダムに振る舞う機能を、どのように JUnit でテストできるようにするかを記載しています。
http://atnd.org/events/42501

KOMIYA Atsushi

September 28, 2013
Tweet

More Decks by KOMIYA Atsushi

Other Decks in Technology

Transcript

  1. 今⽇日のお話 • 動機 • Random#nextInt() などで得られる乱数に 従って振る舞い、出⼒力力が決まる機能を   JUnit  でテストしたい • でも、普通に  JUnit

     を使っただけでは結果 が不不定なテストとなってしまう… データサイエンスを⽣生業としている企業らしく… 統計的な⼿手法を 使って解決しよう! 9
  2. ユニットテストへの統計学的アプローチ • 推計統計学における「仮説検定」の考え⽅方 を利利⽤用する • コイントスによる仮説検定の例例    (⼆二項検定) • 「コイントスを  20 回試してみたんだけど、 表が

     15  回も出たんだよね。このコインって、 歪んでる(1/2の確率率率じゃない)のかな?」 • 「歪んでないコインと仮定した場合、20 回 コイントスしてたまたま表が  15  回出る確率率率は   5%  以下(4.139%)だよ〜~?  だから、5%  の 確率率率で間違いかもしれないけど歪んでいると ⾔言えそうだねっ!」 13
  3. ユニットテストへの統計学的アプローチ • 推計統計学における「仮説検定」の考え⽅方 を利利⽤用する • コイントスによる仮説検定の例例    (⼆二項検定) • 「コイントスを  20 回試してみたんだけど、 表が

     15  回も出たんだよね。このコインって、 歪んでる(1/2の確率率率じゃない)のかな?」 • 「歪んでないコインと仮定した場合、20 回 コイントスしてたまたま表が  15  回出る確率率率は   5%  以下(4.139%)だよ〜~?  だから、5%  の 確率率率で間違いかもしれないけど歪んでいると ⾔言えそうだねっ!」 100% の精度度ではない 14
  4. ユニットテストへの統計学的アプローチ • 推計統計学における「仮説検定」の考え⽅方 を利利⽤用する • コイントスによる仮説検定の例例    (⼆二項検定) • 「コイントスを  20 回試してみたんだけど、 表が

     15  回も出たんだよね。このコインって、 歪んでる(1/2の確率率率じゃない)のかな?」 • 「歪んでないコインと仮定した場合、20 回 コイントスしてたまたま表が  15  回出る確率率率は   5%  以下(4.139%)だよ〜~?  だから、5%  の 確率率率で間違いかもしれないけど歪んでいると ⾔言えそうだねっ!」 試⾏行行回数 p 値 有意⽔水準 15
  5. ユニットテストに応⽤用する • 例例 • 60% の確率率率で  “晴れ”  を、 25% の確率率率で  “曇り”  を、

    15% の確率率率で  “⾬雨” を返すメソッド String  weather()  をテストしたい! • 100 回呼び出したときの各事象の頻度度 事象 推定値  [回] 観測値  [回] 晴れ 100 * 0.60 = 60 55 曇り 100 * 0.25 = 25 27 ⾬雨 100 * 0.15 = 15 18 17
  6. ユニットテストに応⽤用する • 例例 • 60% の確率率率で  “晴れ”  を、 25% の確率率率で  “曇り”  を、

    15% の確率率率で  “⾬雨” を返すメソッド String  weather()  をテストしたい! • 100 回呼び出したときの各事象の頻度度 事象 推定値  [回] 観測値  [回] 晴れ 100 * 0.60 = 60 55 曇り 100 * 0.25 = 25 27 ⾬雨 100 * 0.15 = 15 18 この「ずれ」は 果たして妥当 なのだろうか? 18
  7. 仮説検定を利利⽤用したユニットテストの検出精度度   偽陽性と偽陰性 • 先に述べた通り、仮説検定の精度度は  100% ではない • ユニットテストにおける偽陽性・偽陰性を考えてみよ う • 偽陽性(第⼀一種過誤、False positive) • OK

    と判定されるテストケースが、実⾏行行の結果、誤って   NG  として検出されてしまう状況(誤検知) • 偽陰性(第⼆二種過誤、False negative) • 偽陽性とは逆に、NG として検出されるべき テストケースが  OK 判定になる状況(バグ検出漏漏れ) • 両⽅方ともに少ない状況が望ましい • 状況によっては、偽陰性がより重視されることも 23
  8. 有意⽔水準 • NG を検出する精度度を左右する重要な要素 • ⼀一般的な仮説検定では  5% or 1% とする • ユニットテストにおいて、有意⽔水準を • ⼤大きくする

    •  J NG  結果の検知漏漏れは減る •  L OK →  NG  の誤検知が増える • ⼩小さくする •  J OK →  NG  の誤検知は減る •  L NG 結果の検知漏漏れが増える 24
  9. 使い⽅方 //  試⾏行行により観測された各事象の回数   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