TDDハンズオン
XP祭り20162016/09/24
自己紹介
Name: 大橋 勇希
Work: アドテクエンジニア(株式会社ジーニー)TDD: 約3年Twitter: @secret_hamuhamu
普段の業務
・DSP管理画面の機能開発
・テスト環境の整備
・DBA・チームビルディング
目的
TDDについて興味を持ってもらう
TDDについて理解を深めてもらう
TDDに挑戦するきっかけになること
※ TDD初学者を対象とします
アンケート
1.普段テストコードを書いていない
2.テストコードをなるべく書いているけれども勉強中
3.日常的にテストコードを書いてプロジェクトを駆動させている状態
完璧に設計にしたつもりが
実際に出来上がったものと
ギャップがある
TestDrivenDevelopment
What is TDD?プログラム開発手法の一種で、
プログラムに必要な各機能について、
最初にテストを書き、そのテストが動作する
必要最低限な実装をとりあえず行った後、
コードを洗練させる、という
短い工程を繰り返すスタイルである。
https://ja.wikipedia.org/wiki/テスト駆動開発
What is TDD?
テストコードを書いて実行することに
より開発を促進させるための手法
What is TDD?
TDDは設計と実装を
シームレスに繋ぐ潤滑油
開発スピード向上
What is TDD?
What is TDD?
テストコードを書くと逆に
開発スピードが落ちないか?
What is TDD?テストについて目線合わせ
TDDにおけるテスト
TDDのテストは品質保証を目的とした
テストではない
TDDにおけるテスト
TDDのテストは開発促進・設計行為を
目的としている
TDDにおけるテスト開発者のためのテスト
(Checking)品質保証のためのテスト
(Testing)・ブラウザで実行確認・コマンドを打って実行確認・デバッグツール ・IDE ・デバック関数
デバッグ行為
・様々な入力パターンの検証・セキュリティ・パフォーマンスなど
TDDにおけるテスト開発者のためのテスト
(Checking)品質保証のためのテスト
(Testing)・ブラウザで実行確認・コマンドを打って実行確認・デバッグツール ・IDE ・デバック関数
デバッグ行為
・様々な入力パターンの検証・セキュリティ・パフォーマンスなど
TDDにおけるテスト開発者のためのテスト
(Checking)品質保証のためのテスト
(Testing)・ブラウザで実行確認・コマンドを打って実行確認・デバッグツール ・IDE ・デバック関数
デバッグ行為
・様々な入力パターンの検証・セキュリティ・パフォーマンスなど
TDDにおけるテスト開発者のためのテスト
(Checking)品質保証のためのテスト
(Testing)・ブラウザで実行確認・コマンドを打って実行確認・デバッグツール ・IDE ・デバック関数
デバッグ行為
・様々な入力パターンの検証・セキュリティ・パフォーマンスなど
TDDにおけるテスト開発者のためのテスト
(Checking)品質保証のためのテスト
(Testing)・ブラウザで実行確認・コマンドを打って実行確認・デバッグツール ・IDE ・デバック関数
デバッグ行為
・様々な入力パターンの検証・セキュリティ・パフォーマンスなど
TDD
TDDにおけるテスト
TDDのためにテストコードを書くこと ≠
品質保証のためにテストコードを書くこと
TDDにおけるテスト
TDDにおいてテストコードは
デバッグツールの代わり
TDDにおけるテスト
成果物の動作確認
テスト実行 > ブラウザをリロード・手動実行
早くて確実なフィードバックが得られる
TDDの研究論文
TDD(テスト駆動開発)の適用評価を紹介した研究論文 - エリクソンはじめ3社http://blogs.itmedia.co.jp/morisaki/2010/03/tdd---3-5b4a.html
TDDを実施してみて
・機能テストでの不具合検出が18%減少した
・実装時間が16%増えた
・テストのカバレッジが大きくなった
TDDの研究論文
TDD(テスト駆動開発)の適用評価を紹介した研究論文 - エリクソンはじめ3社http://blogs.itmedia.co.jp/morisaki/2010/03/tdd---3-5b4a.html
被験者を対象としたアンケート
・96%の被験者がデバッグの工数を減らすと感じた
・88%の被験者が要求が洗練されると感じた
・92%の被験者がコードの品質を上げると感じた
・50%の被験者が開発工数を減らすと感じた
TDDの研究論文
実装時間は増えるが
デバッグ時間が減る
トータルの開発時間が削減される
“動作するきれいなコード”を生み出すこと
TDDの目標
“動作する汚いコード”にストレスを感じていないか?
TDDの目標
TDDの目的
きれい
汚い
動作しない 動作する
レガシーコード
到達したいゴール
TDDの目的
きれい
汚い
動作しない 動作する
到達したいゴール
この道はなかなか難しい ...
TDDの目的
きれい
汚い
動作しない 動作する
レガシーコード
きっちり設計したつもりが。。。
TDDの目的
きれい
汚い
動作しない 動作する
到達したいゴール
TDDのアプローチこっちならいけそう!!
TDDの目的
きれい
汚い
動作しない 動作する
レガシーコード
到達したいゴール
一度動いたものを変更するのが怖い ...!!
安全に登っていく
必要がある
TDDの目標
安心して設計と実装を
満足するまで作りこめる
TDDの目標
動作するきれいなコードを
生み出すには?
動作するきれいなコードを生み出すには?
目標を達成するには作戦が必要
動作するきれいなコードを生み出すには?
自分は正しい努力をしているのか、
毎日自分に問いかけよ
リファクタリングとテストの関係http://d.hatena.ne.jp/jun-yoshida/20060829/1156809373
TDDのリズム
高速なフィードバックループ
システムや人が成長するには
餌が必要
インクリメンタルな設計
ちょっとづつ確実に積み上げる
TODOリスト
テストファースト
アサートファースト
思考整理術
数百人が参加する
クリスマスパーティの
幹事をすることになった
TODOリスト
仕様を細かく
ブレークダウンする
TODOリスト
大きいタスクを小さいタスクに分割する・参加者の予定調整
・お店選び
・料理のコース決め
・参加者に連絡
・乾杯の挨拶
・コンテンツ用意
・集金
TODOリスト
実装を考えるよりも先に、
インターフェース(入出力)を考える
テスト・アサートファースト
TDDのためにテストを書く = 設計
テスト・アサートファースト
TDDの流れ
1.TODOリストを作る
2.テストコードを書く
3.テストを失敗させる
4.テストを成功させる
5.リファクタリングする
3 ~ 5を繰り返し、動作するきれいなコードへ
How to TDD
デモhttps://github.com/hamuhamu/tdd_hands-on
How to TDD
レガシーコード改善ガイド8章
TDDの大きな価値一度に一つのことに集中できる
・あまり考え過ぎない
・現在着手していることをまず終わらせる
・まず、テストを通過させる、最適化は二の次
・重複は取り除くこと、メンテナンスの重荷になる
How to TDD
・コードが研磨された感じる
・面倒なデバッグが減った
・仕様を早い段階から深く考えれるようになった
・エンジニアとして成長できた
わたしとTDD
テストは壁を与えてくれる
わたしとTDD
エンジニアとしての成長
・オブジェクト指向プログラミング能力の向上
・リファクタリング能力の向上
・データ設計能力の向上
・アプリケーションの設計能力の向上
わたしとTDD
TDDは品質を向上させる
テストではない
最後に
品質を向上させるのは
設計・実装をする人
最後に
人のスキルを向上させるの
がTDD
最後に
一緒に勉強していきましょ
う!!
お気軽にお声がけこえかけてください
@secret_hamuhamu
最後に
エンジニア募集してます!!
・チームマネジメント/プロジェクトマネジメント
・サーバサイド開発など
勉強会の会場提供なども
できます
https://geniee.snar.jp/
最後に
ご静聴ありがとうございまし
た
最後に