忍者式テストを 
やってみた 
2014/10/04 中島 滋 
株式会社ラグザイア
とてか03 
招待講演
自己紹介 
中島滋(@@lleeddssuunn) 
WWeebb系受託開発 
プログラマ 
JJaavvaaSSccrriipptt、CC##
今日の献立
11.. 忍者式テストを超簡単に 
22.. 忍者式テストはレグレッション 
33.. 忍者式テストのTTeessttiinngg面 
44.. 忍者式テストを詳しく 
55.. 忍者式テストのうれしさ 
66.. まとめ
11..忍者式テストを超簡単に
毎日テストを実施する 
受け入�れ試験 
手で行う
ここでテスト項目を見せる
22..忍者式テストをレグレッション 
に使う
今日の話の 
お得ポイント
忍者式テストは 
レガシーコードと戦う時に 
使えた
レガシーコードは存在する 
! 
機能を追加したい 
リファクタリングしたい
レガシーコードの例 
22885544行 
JJaavvaaSSccrriipptt 
スコープを意識していない 
大域変数 
((アプリケーションに閉じてる)) 
非モジュール(グループ)化 
エディタアプリケーション 
(GGUUII) 
テストコードなし
ここで対象となる 
アプリケーションを見せる
レガシーコードと戦う 
基礎戦術
基礎戦術11 
! 
仕様が明確な関数を取り出し 
テストコードを書く
分割されていないコードは 
仕様を理解して 
取り出せる部分が小さい 
数〜数十行 
! 
99割がモンスターのまま残る 
110000〜11000000回やる?
機能を足したいから 
リファクタリングしたい
レガシーコードでは 
理解し難い部分が 
変更したい部分 
なことが多い
効果が出るまで 
時間がかかるので 
やめました
基礎戦術22 
! 
ソフトウェアを 
数個のモジュールに分割する
分割にテストコードは必要か
網羅したテストを書くには 
時間がかかる
テストコードを書かずに 
リファクタリング 
! 
スコープをわける 
大きな変更は 
手で動作確認できる 
(まだ忍者式テストでない)
GGUUIIのモジュール分割の王道 
! 
11.. コンポーネント分割 
22.. PPrreesseennttaattiioonn--DDoommaaiinn--SSeeppaarraattiioonn 
(プレゼンテーションとドメイン) 
33.. SSmmaallllttaallkk--8800 MMVVCC 
(モデル・ビュー・コントローラー)
33.. SSmmaallllttaallkk--8800 MMVVCCは 
「TThhee MMooddeell--VViieeww--CCoonnttrroolllleerr 
((MMVVCC)) IIttss PPaasstt aanndd PPrreesseenntt」 
が手引きになる
SSmmaallllttaallkk--8800 MMVVCCでは 
CCoonnttrroolllleerrがでかい! 
! 
モデルの更新とビューの更新 
両方やる 
! 
44.. SSeeppaarraatteedd PPrreesseennttaattiioonn 
ビューがOObbsseerrvveerrに 
モデルが変わったら勝手に更新
44.. SSeeppaarraatteedd PPrreesseennttaattiioonnは 
「ステートフルJJaavvaaSSccrriipptt」が 
手引きになる
OObbsseerrvveerr付きMMVVCCに分けても 
CCoonnttrroolllleerrがでかい! 
! 
作ったオブジェクトを自動選択 
! 
11..モデルつくる 
22..ビューに表示 
33..選択状態に更新
55.. MMooddeell VViieeww PPrreesseenntteerr 
! 
選択状態のモデル化 
sseelleeccttiioonn 
ビューはsseelleeccttiioonnも監視
「MMVVPP:: MMooddeell--VViieeww--PPrreesseenntteerr 
TThhee TTaalliiggeenntt PPrrooggrraammmmiinngg 
MMooddeell ffoorr CC++++ aanndd JJaavvaa 」を 
読んでもわからない! 
! 
このアプリケーションに 
上手くはまるの?
不安 
! 
適用後のソースコードが 
イメージできない 
! 
手探りでの変更
変更中に 
アプリケーションを 
壊したら 
早く知りたい
やっぱり 
テストハーネスが欲しい!
テストコードを書く? 
! 
分割したいのは 
CCoonnttrroolllleerr 
ユーザー入�力と密接 
! 
PPhhaannttoommJJSS?? 
SSeelleenniiuumm?? 
! 
そうだ手でやろう!
忍者式テスト
AA44用紙に今までやった 
確認手順を書き出す 
数件 
実行してみる
次の日にもやる 
赤ペンも入�れる
なんと言うことでしょう! 
! 
そこには 
今まで見たこともないバグが 
ありました
期待通り 
! 
テストハーネスとして 
機能する 
(CChheecckkiinngg)
それ以上に 
! 
未知のバグが見つかった 
((TTeessttiinngg)) 
! 
引き継ぎ前のバグ 
引き継ぎ後に入�れいたバグ
いったん確認 
! 
忍者式テストは 
レガシーコードと戦う一戦術 
! 
TTeessttiinnggの側面もある?
ここまで 
22.. 忍者式テストを 
レグレッションに使う 
! 
ここから 
33.. 忍者式テストのTTeessttiinngg面
忍者式テストでは 
新しいテストが見つかる 
! 
なぜだろう?
秋山 浩一さんの洞察 
元・富士ゼロックス 
テストコンサルタント
@@aakkiiyyaammaa992244 
テスターは、いい加減なテスト 
ケースを元に、そこからちょっ 
と外れた操作をしてバグを見つ 
けていると思います。hhttttppss:://// 
ttwwiitttteerr..ccoomm//aakkiiyyaammaa992244// 
ssttaattuuss// 
550066225555440011553377338844444488
これだ! 
! 
忍者式テストでも 
テストケースから 
ちょっと外れた操作をした時 
バグを見つけている
どういうわけか 
紙に向�かって 
テストケースを考える時には 
思いつかない
思いついても 
テストケースを書くのが 
面倒
バグを見つけた手順 
(CChheecckkiinngg) 
! 
有効なテストケースは残す
忍者式テストは 
毎日、人がやる 
毎日、ちょっとずつ変わる 
! 
TTeessttiinngg 
(未知の問題が見つかる)
44..忍者式テストを詳しく
準備 
11..新機能の確認テストを追加 
! 
テストを実行 
22..既存のテストを改�善 
33..新しく発見したテストを追加 
44..要らなくなったテストを削除
11..その日追加した 
新機能のテストを追加 
! 
雑 
機能確認程度 
正しい動作のメモ代わり
22..昨日までのテストを修正 
わかりやすく 
早く終わる手順に 
! 
文章の添削に一日置く感じ
33..新しく発見したテストを 
追加
新しいテストは一番上に追加 
実行頻度を高く
44..バグを 
発見できなくなった 
テストを止める 
! 
基準は感性 
「めんどくさいなー」 
多分合っているけど不安 
気合い
疲れていると 
気合い不足 
テストが減らない 
! 
すごく疲れていると 
何でもめんどくさくなる 
テストが減らない
テストは健康な状態で 
やらなければならない
55.. 忍者式テストをやると 
うれしいこと
最初に完璧なテストを 
書かなくてよい 
! 
フォーマット 
カバレッジ 
効率
最初のハードルは低い 
! 
毎日やると 
ちゃんとバグが見つかる
テストを足してから 
一週間ぐらいは 
新しいテストとバグが見つる 
! 
ただし 
毎日やらないと 
バグが見つからない
毎日テストしないと恐い
大きなリファクタリングが 
終わっても 
(二ヶ月経過) 
やめていないのは 
TTeessttiinnggの面が大きいから
まとめ
忍者式テストで 
! 
テストコードが書けなくても 
レガシーコードと戦える 
! 
未知のバグも発見できる 
テストにちょっと自信がもてる
忍者式テストをやろう 
! 
書けるなら 
最初からテストコードを 
書いてくれ
ご清聴 
ありがとうございました

Ninja Testing at Toteka03