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

Memory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native CollectionsMemory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native CollectionsYoshifumi Kawai
 
僕らのおれおれメトリクス / We Metrics Our Own Way!
僕らのおれおれメトリクス / We Metrics Our Own Way!僕らのおれおれメトリクス / We Metrics Our Own Way!
僕らのおれおれメトリクス / We Metrics Our Own Way!Yasui Tsutomu
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...NTT DATA Technology & Innovation
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with KarateTakanori Suzuki
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例gree_tech
 
自動テスト知識体系TABOKのご紹介
自動テスト知識体系TABOKのご紹介自動テスト知識体系TABOKのご紹介
自動テスト知識体系TABOKのご紹介Shinsuke Matsuki
 
「品質ダッシュボード」と「データによる意思決定」
「品質ダッシュボード」と「データによる意思決定」「品質ダッシュボード」と「データによる意思決定」
「品質ダッシュボード」と「データによる意思決定」Kohei Tomita
 
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)NTT DATA Technology & Innovation
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するKohei Tokunaga
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
Study on Android Emulator
Study on Android EmulatorStudy on Android Emulator
Study on Android EmulatorSamael Wang
 
ソフトウェアの品質保証の基礎とこれから
ソフトウェアの品質保証の基礎とこれからソフトウェアの品質保証の基礎とこれから
ソフトウェアの品質保証の基礎とこれからYasuharu Nishi
 
#ljstudy KVM勉強会
#ljstudy KVM勉強会#ljstudy KVM勉強会
#ljstudy KVM勉強会Etsuji Nakai
 
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計コンポーネント指向と余白の設計
コンポーネント指向と余白の設計Manabu Yasuda
 
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트Amazon Web Services Korea
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Preferred Networks
 
OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月
OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月
OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月VirtualTech Japan Inc.
 

What's hot (20)

Memory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native CollectionsMemory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native Collections
 
僕らのおれおれメトリクス / We Metrics Our Own Way!
僕らのおれおれメトリクス / We Metrics Our Own Way!僕らのおれおれメトリクス / We Metrics Our Own Way!
僕らのおれおれメトリクス / We Metrics Our Own Way!
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
 
自動テスト知識体系TABOKのご紹介
自動テスト知識体系TABOKのご紹介自動テスト知識体系TABOKのご紹介
自動テスト知識体系TABOKのご紹介
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
「品質ダッシュボード」と「データによる意思決定」
「品質ダッシュボード」と「データによる意思決定」「品質ダッシュボード」と「データによる意思決定」
「品質ダッシュボード」と「データによる意思決定」
 
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Study on Android Emulator
Study on Android EmulatorStudy on Android Emulator
Study on Android Emulator
 
ソフトウェアの品質保証の基礎とこれから
ソフトウェアの品質保証の基礎とこれからソフトウェアの品質保証の基礎とこれから
ソフトウェアの品質保証の基礎とこれから
 
#ljstudy KVM勉強会
#ljstudy KVM勉強会#ljstudy KVM勉強会
#ljstudy KVM勉強会
 
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
 
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
 
OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月
OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月
OpenStackをコマンドで攻める! 構築・運用とトラブル解決 - OpenStack最新情報セミナー 2014年6月
 

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