テスト駆動開発入門
2012.11.17 札幌Javaカンファレンス2012
       渡辺修司(@shuji_w6e)




                               1
自己紹介
渡辺 修司
Javaプログラマ

 株式会社エスプラニング所属

 ウェブアプリやデスクトップアプリの開発

テスト駆動開発、ユースケース駆動開発

アジャイル開発

最近の趣味はロードバイクとフットサル
@shuji_w6e
札幌 Javaコミュニティ

TDD Boot Camp

やさしいデスマーチ(Blog)

執筆活動

 WEB DB Press vol.69

 JUnit実践入門(11/21)
テスト駆動開発とは?
テストファースト

動作するきれいなコード


設計を駆動する開発手法
ソフトウェア開発の流れ
  ユーザ要求定義(要件定義)


  システム要求定義(外部設計)


   詳細設計・プログラミング


     テスト(評価)
ソフトウェア開発の流れ
  ユーザ要求定義(要件定義)


  システム要求定義(外部設計)


   詳細設計・プログラミング
            単体テスト

     テスト(評価)
V字モデル
 要件定義        受入テスト


 外部設計      システムテスト


  内部設計     結合テスト


 プログラム設計   単体テスト
単体テスト(理想)
詳細設計(内部設計)でプログラムの品質を
高め、手戻りを減らす

詳細設計のレビューを実施することで品質を
高める

プログラミングは単純作業

詳細設計が正しく実装されているかを検証
単体テスト(現実)
ソフトウェアは複雑
               詳細設計
やってみなければ解らない

プロトタイピング        実装
実装のテストになる

詳細設計がテストされない   単体テスト
単体テスト(現実)
ソフトウェアは複雑
               詳細設計
やってみなければ解らない

プロトタイピング
                ?
                実装
実装のテストになる
                ?
               単体テスト
詳細設計がテストされない
単体テスト(現実)
ソフトウェアは複雑
               詳細設計
やってみなければ解らない

プロトタイピング
                ?
                実装
実装のテストになる
                ?
               単体テスト
詳細設計がテストされない

単体テストが機能していない?
V字モデルの問題点
完璧な詳細設計を先に行うのは難しいため、
確実に手戻りが発生する

詳細設計をテストすべき単体テストが実装を
テストしている
http://www.flickr.com/photos/alisdair/135306281/
テスト駆動開発のサイクル
                            1.設計する
5.リファクタリング



               Heuristics




                               2.テストを書く



 4.テストを成功させる

                        3.コードを書く
テストファースト
原則としてテストを先に書く

テストファーストがベスト

設計が机上でまとまらない場合

プロトタイプを作ってみる

テストを書く

プロトタイプを捨てるか利用するか決める
http://www.flickr.com/photos/snowyuki/5223599006/
FizzBuzz
 1から100までの整数を順番に出力する

 ただし、

 値が3の倍数の場合は「Fizz」を

 値が5の倍数の場合は「Buzz」を

 値が3と5の公倍数の場合は「FizzBuzz」を

 それぞれ表示すること
http://www.flickr.com/photos/alisdair/2398525854/
テスト駆動開発のサイクル
                            1.設計する
5.リファクタリング



               Heuristics




                               2.テストを書く



 4.テストを成功させる

                        3.コードを書く
動作するきれいなコード

きれい




 汚い




      動かない   動く
1.設計する
                                              1.設計する
                  5.リファクタリング



                                 Heuristics




                                                 2.テストを書く



                   4.テストを成功させる
きれい
                                          3.コードを書く




汚い




      動かない   動く
2.テストを書く
                                              1.設計する
                  5.リファクタリング



                                 Heuristics




                                                 2.テストを書く



                   4.テストを成功させる
きれい
                                          3.コードを書く




汚い




      動かない   動く
3.コードを書く
                                              1.設計する
                  5.リファクタリング



                                 Heuristics




                                                 2.テストを書く



                   4.テストを成功させる
きれい
                                          3.コードを書く




汚い




      動かない   動く
4.テストを成功させる
                                              1.設計する
                  5.リファクタリング



                                 Heuristics




                                                 2.テストを書く



                   4.テストを成功させる
きれい
                                          3.コードを書く




汚い




      動かない   動く
5.リファクタリング
                                              1.設計する
                  5.リファクタリング



                                 Heuristics




                                                 2.テストを書く



                   4.テストを成功させる
きれい
                                          3.コードを書く




汚い




      動かない   動く
1.設計する
                                              1.設計する
                  5.リファクタリング



                                 Heuristics




                                                 2.テストを書く



                   4.テストを成功させる
きれい
                                          3.コードを書く




汚い




      動かない   動く
デモ
 http://www.flickr.com/photos/snowyuki/5223599006/
http://www.flickr.com/photos/palermobootcamp/5464512672/
http://www.flickr.com/photos/jas_132/5403388208
http://www.flickr.com/photos/sirod47/5538908868/
ソフトウェア開発は楽しい
創造的労働

実際に動くモノをゼロから作れる。

期待通りに動けば嬉しい。

知的労働

アイディアをモノに反映できる。

難しい問題を解決できれば嬉しい。
スキル不足
仕様変更


                                     経験不足
複雑な要件

                                                   不安
   http://www.flickr.com/photos/yopse/3772030400/
テスト駆動開発
コードが満たす条件が明確になる

コード変更時の影響が見える

自然と疎結合な設計になる

積極的なリファクタリングを行える

自動化され、繰り返して実行できる
テスト駆動開発
コードが満たす条件が明確になる

コード変更時の影響が見える

自然と疎結合な設計になる

積極的なリファクタリングを行える

自動化され、繰り返して実行できる

   開発時の不安が軽減できる!
反復的な開発
      ユニットテスト



 プログラミング        詳細設計

反復的にテスト・設計・プログラミング

素早いフィードバックで変更に強くなる
反復的な開発
      ユニットテスト



 プログラミング        詳細設計

反復的にテスト・設計・プログラミング

素早いフィードバックで変更に強くなる

  アジャイル的な手法
反復的な開発
      ユニットテスト

    テスト駆動開発
 プログラミング        詳細設計

反復的にテスト・設計・プログラミング

素早いフィードバックで変更に強くなる

  アジャイル的な手法
なぜ、TDDを実践するか?
ソフトウェアは思った以上に複雑

パーフェクトプログラマなんかいない

不安だからユニットテストを書く

セーフティネットとしてのユニットテスト

すばやく回し、すばやいフィードバック
セーフティネット




   http://www.flickr.com/photos/32010000@N08/2987901256/
設計を駆動する開発手法
 http://www.flickr.com/photos/86921622@N00/281632021/
テスタビリティ
状態や副作用

戻り値

予測可能なオブジェクト

疎結合
テスタビリティ
状態や副作用

戻り値

予測可能なオブジェクト

疎結合



  よい設計であればテストしやすい
テスト駆動の真実
                            1.設計する
5.リファクタリング



               Heuristics




                               2.テストを書く



 4.テストを成功させる

                        3.コードを書く
テスト駆動の真実
                            1.設計する
5.リファクタリング



               Heuristics




                               2.テストを書く



 4.テストを成功させる

                        3.コードを書く
テスト駆動の真実
                            1.設計する
5.リファクタリング



               Heuristics




                               2.テストを書く



 4.テストを成功させる

                        3.コードを書く
http://www.flickr.com/photos/terrydonaghe/1117999/
小さく
個別に
すばやく
ひとつずつ、一歩ずつ
小さなステップで

大きなものは小さく分割

確実に、堅実に

手戻りを小さく
ひとりずつ、仕留める
テストは個別撃破する

次のテストを作らない
すばやくまわす
                                    1.設計する
小さく回す   5.リファクタリング



早く回す                   Heuristics




すぐに対応                                  2.テストを書く



リズム重要    4.テストを成功させる

                                3.コードを書く
使う
  作る
伝える
自分が最初のユーザー
使いにくいものは使いにくい

自分で評価する

納得できるか?

恥ずかしくないか?

解りやすいか?
道具にこだわる
最高のパフォーマンスを維持する

プロとしてのこだわり

少しでも使いやすく

日々、研究・工夫
未来の自分が読む
テストコードは保守される

読みにくいコードは悪

シンプルに

名前重要

型
http://www.flickr.com/photos/akikophotography/530984398/
とにかく書く

パターン化しやすいので習得しやすい

テスティングフレームワークを活用する

テスト技法を学び幅を広げる



    http://www.flickr.com/photos/akikophotography/530984398/
テスト駆動開発入門
テスト駆動開発入門

テスト駆動開発入門

Editor's Notes

  • #2 \n
  • #3 30秒程度\n
  • #4 \n
  • #5 \n
  • #6 \n
  • #7 \n
  • #8 従来のやり方の問題\n
  • #9 \n
  • #10 \n
  • #11 \n
  • #12 \n
  • #13 \n
  • #14 \n
  • #15 具体的には?\n
  • #16 \n
  • #17 \n
  • #18 FizzBuzzのデモ\n
  • #19 FizzBuzzのデモ\n
  • #20 よくわからない、むずかしい⇒目的と効果\n
  • #21 \n
  • #22 \n
  • #23 \n
  • #24 \n
  • #25 \n
  • #26 \n
  • #27 \n
  • #28 \n
  • #29 \n
  • #30 習得できるスキルである\n
  • #31 銀の弾丸ではない\n
  • #32 習得できる\n
  • #33 TDDをはじめるワケ\n
  • #34 \n
  • #35 \n
  • #36 \n
  • #37 \n
  • #38 \n
  • #39 \n
  • #40 \n
  • #41 \n
  • #42 \n
  • #43 \n
  • #44 \n
  • #45 TDDのこころ\n
  • #46 \n
  • #47 \n
  • #48 \n
  • #49 \n
  • #50 \n
  • #51 \n
  • #52 \n
  • #53 \n
  • #54 学ぶためには?\n
  • #55 学ぶためには?\n
  • #56 \n
  • #57 \n