SlideShare a Scribd company logo
1 of 70
Download to read offline
忍者式テストを 
やってみた 
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の面が大きいから
まとめ
忍者式テストで 
! 
テストコードが書けなくても 
レガシーコードと戦える 
! 
未知のバグも発見できる 
テストにちょっと自信がもてる
忍者式テストをやろう 
! 
書けるなら 
最初からテストコードを 
書いてくれ
ご清聴 
ありがとうございました

More Related Content

What's hot

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Masahito Zembutsu
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
IT系エンジニアのためのプレゼンテーション入門
IT系エンジニアのためのプレゼンテーション入門IT系エンジニアのためのプレゼンテーション入門
IT系エンジニアのためのプレゼンテーション入門Masahito Zembutsu
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考えるtomo_masakura
 
MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうShun Hikita
 
テストを書こう!!
テストを書こう!!テストを書こう!!
テストを書こう!!拓 小林
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーke-m kamekoopa
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
データモデリング・テクニック
データモデリング・テクニックデータモデリング・テクニック
データモデリング・テクニックHidekatsu Izuno
 
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf株式会社MonotaRO Tech Team
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所Kotaro Ogino
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
探索的テストはじめの一歩 #wacate
探索的テストはじめの一歩 #wacate探索的テストはじめの一歩 #wacate
探索的テストはじめの一歩 #wacateToshiyuki Kawanishi
 

What's hot (20)

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
入門!Jenkins
入門!Jenkins入門!Jenkins
入門!Jenkins
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
IT系エンジニアのためのプレゼンテーション入門
IT系エンジニアのためのプレゼンテーション入門IT系エンジニアのためのプレゼンテーション入門
IT系エンジニアのためのプレゼンテーション入門
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
 
MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かう
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
テストを書こう!!
テストを書こう!!テストを書こう!!
テストを書こう!!
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
JCSQE初級受けてみたの
JCSQE初級受けてみたのJCSQE初級受けてみたの
JCSQE初級受けてみたの
 
データモデリング・テクニック
データモデリング・テクニックデータモデリング・テクニック
データモデリング・テクニック
 
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
探索的テストはじめの一歩 #wacate
探索的テストはじめの一歩 #wacate探索的テストはじめの一歩 #wacate
探索的テストはじめの一歩 #wacate
 

More from Nakajima Shigeru

More from Nakajima Shigeru (6)

Introduction of ES2015
Introduction of ES2015Introduction of ES2015
Introduction of ES2015
 
ChakraCore is what?
ChakraCore is what?ChakraCore is what?
ChakraCore is what?
 
20151117 es lint
20151117 es lint20151117 es lint
20151117 es lint
 
東京Node学園祭飛び込みLT
東京Node学園祭飛び込みLT東京Node学園祭飛び込みLT
東京Node学園祭飛び込みLT
 
Why js
Why jsWhy js
Why js
 
Ninja Testing at XP Matsuri
Ninja Testing at XP MatsuriNinja Testing at XP Matsuri
Ninja Testing at XP Matsuri
 

Ninja Testing at Toteka03