71
TDD BootCamp in JJUG CCC 2014.05.17 JJUG CCC 2014 Spring Shuji Watanabe (@shuji_w6e) 1 #ccc_r53 #jjug_ccc https://github.com/shuji/legacy-hanbai-kanri

TDD BootCamp in JJUG CCC - レガシーコード対策編 -

Embed Size (px)

DESCRIPTION

JJUG CCC 2014 Soringで行ったユニットテストハンズオンでの資料です。

Citation preview

Page 1: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDD BootCamp in JJUG CCC2014.05.17 JJUG CCC 2014 Spring Shuji Watanabe (@shuji_w6e)

1

#ccc_r53 #jjug_ccchttps://github.com/shuji/legacy-hanbai-kanri

Page 2: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

自己紹介

Page 3: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

渡辺 修司 / @shuji_w6e札幌Javaコミュニティ

やさしいデスマーチ

JUnit実践入門

Java, Groovy, JavaScript, AWS, TDD

ロードバイク, スノーボード, トレランNEW

4刷!累計1万部

Page 4: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

最近のお仕事...昨年8月に転職

株式会社クラスメソッド

札幌にて在宅勤務

AWS利用者向けシステムの開発

主にフロントエンドや自動化などを担当

Spring, Ember.js, d3-data

ブログ業務

Page 5: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

クラスメソッド札幌オフィス開設!AWSエンジニア / iOSエンジニア

U/Iターン歓迎!

7月初旬 開設予定!

アプリ屋から 移籍可能

Page 6: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

Special Thanks TA@i_takehiro

@grimrose

@sue445

@setoazusa

@torazuka

@uasano

@yujiorama

Page 7: TDD BootCamp in JJUG CCC - レガシーコード対策編 -
Page 8: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDBCへ ようこそ

Page 9: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://devtesting.jp/tddbc/

TDD Boot Camp(TDDBC) とは、テスト駆動開発(Test Driven Development)について、座学だけでなく、実習形式で手を動かして体得することを目的とするイベントです。

Page 10: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ショートバージョン2時間しかないのでダイジェストで! TDDとは? TDDは死んだ? レガシーコード体験 レガシーコード改善 モデリング ユニットテストハンズオン

Page 11: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

本家TDDBCとの違いショートバージョン(本家は1日)

ペアプログラミングは行わない

レビュー大会は行わない

テストファーストに拘らない

プロダクションコードは8分組み

レガシーコードからTDDを体験する

Page 12: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

テスト駆動開発とは?

Page 13: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

テスト駆動開発とは?ソフトウェアの開発手法

テスト駆動開発の1サイクル

はじめにテストコードを書く

テストが成功する必要最低限のコードを書く

テスト成功を維持してリファクタリングする

上記サイクルを素早くテンポ良く繰り返す

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 14: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDのサイクル1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 15: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDD≠品質保証テスト品質保証テストはソフトウェアを対象とし、品質担当者が高い品質を担保するために実施

TDDは品質を担保するわけではない

結果的に品質は高まるが主目的ではない

開発者が安心して開発できるための開発手法

TDDは設計やプログラム自体を対象とする

Page 16: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

汚いコードは動かない密結合

多重ネスト

巨大なクラス

多すぎる引数

多すぎる責務

Page 17: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/peakman2/1017866785/

レガシーコード!

Page 18: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

レガシーコード生成のプロセス1. 最初の仕様でコードを書く

2. 追加機能で増築する

3. 仕様変更で改築する

4. 似たような機能はコピペして作る

5. これらのプロセスが秘伝のタレとなる

Page 19: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/jas_132/5403388208

TDDで解決?

Page 20: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

レガシーコードへの道設計

Page 21: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

きれいな動くコードへの道

動かない 動く

きれい

汚い

Page 22: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

1.設計する

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 23: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

2.テストを書く

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 24: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

3.コードを書く

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 25: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

4.テストを成功させる

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 26: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

5.リファクタリング

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 27: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

1.設計する

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 28: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDのポイントテストを意識した設計(テストファースト)

テストによる安心

リファクタリング

イテレーティブな開発サイクル

Page 29: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDのこころ

©和田卓人

Page 30: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

小さく  

個別に  

すばやく

Page 31: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ひとつずつ、一歩ずつ小さなステップで

大きなものは小さく分割

確実に、堅実に

手戻りを小さく

Page 32: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ひとりずつ、仕留めるテストは個別撃破する

次のテストを作らない

Page 33: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

すばやくまわす小さく回す

早く回す

すぐに対応

リズム重要

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

Page 34: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

使う  

作る  

伝える

Page 35: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

自分が最初のユーザー使いにくいものは使いにくい

自分で評価する

納得できるか?

恥ずかしくないか?

解りやすいか?

Page 36: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

道具にこだわる最高のパフォーマンスを維持する

プロとしてのこだわり

少しでも使いやすく

日々、研究・工夫

Page 37: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

未来の自分が読むテストコードは保守される

読みにくいコードは悪

シンプルに

名前重要

Page 38: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

どうして、  

テスト駆動開発を  

導入するのか?

Page 39: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/yopse/3772030400/

不安

スキル不足

複雑な要件

スキル不足

仕様変更

経験不足

Page 40: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/32010000@N08/2987901256/

安全を確保する

Page 41: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

なぜ、TDDを実践するか?ソフトウェアは思った以上に複雑

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

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

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

すばやく回し、すばやいフィードバック

Page 42: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDが目指すところ

安心できる健康な開発 変更に強い健康なコード

Page 43: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

テスト駆動開発は死んだ?

Page 44: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/palermobootcamp/5464512672/

TDD!TDD!

テストファースト!

Page 45: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDは死んだ、無益だ!

Page 46: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/bsom/4625185702/

貴様のプロジェクトでは、効果的なテストをしてるか?

Page 47: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

TDDが無益とか有益とか語る前に...(ユニット)テスティングできてますか?

テストファーストはテクニックのひとつ

TDDはユニットテストを学ぶ教科書

常時TDDをやる必要もありません

TDDの考え方を学ぶ価値は大きくあります

Page 48: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

Long live testing

going with the practice of testing where no testing had happened before

Page 49: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

レガシーコード体験NO TESTING

Page 50: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

レガシーコードを読んでみようよくない点を列挙してみよう

どうしてそうなったのかを想像してみよう

5~10分したらディスカッションします

Page 51: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

気になった部分(1)コンストラクタで在庫決め打ちいいの?

シングルトン

フィールド名とか日本語(ローマ字)が気持ち悪い

注文メソッドが色々やりすぎ

過去の編集履歴

税率がハードコーディング

Integerとintが混在

「なんでマイナス?」

Page 52: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

気になった部分(2)全体1クラス

スレッドセーフでない

ジェネリクスが使われていない

ロガーが使われていない

例外処理

JavaDocがあったりなかったり

値の検査がないのでマイナス在庫?

Page 53: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

レガシーコード改善

Page 54: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ユニットテストを活用した改善対象をテストで保護し(仕様化テスト)、

リファクタリングしていく

レガシーコード仕様化テストクラス

クラス

クラス

クラス

ユニットテスト

Page 55: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/alisdair/2398525854/

やってられっか!?

Page 56: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

仕様化テストだけで大変

テストできない部分も多い

コードが複雑でクラス化難しい

そもそもバグが...

辛い、ただ辛い

Page 57: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

汚いコードは動かない密結合

深いネスト

巨大なクラス

多すぎる引数

多すぎる責務

Page 58: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

綺麗なコードは変更に強い疎結合

浅いネスト

小さなクラス

適度な引数

適度な責務

Page 59: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

http://www.flickr.com/photos/k1netik/50298297/

設計麻痺に注意

Page 60: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

モデリング+

テスト駆動開発

Page 61: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

モデリング

Page 62: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

モデリングとは?要求(業務)をモデルに抽象化すること

As-Is から To-Be へ

大雑把に言えば「設計」

概要を掴むための荒いモデリング

詳細を詰めるための詳細なモデリング

特定の目的のためのモデリング

Page 63: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ドメインモデリング業務ドメインでの主要データ

静的モデル

クラス図の基盤

Is-A

Has-A *

1

xxx

xxxxxx

xxx

xxx

*

1

xxx

*

1

*

1

Page 64: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ドメインモデリングの目的問題領域を把握するため

用語を統一するため

ユースケースを作成する基盤とするため

静的な設計のスタート地点とするため

Page 65: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

汎化と集約汎化(Is-A)と集約(Has-A)を使う

他の細かい関係は重要ではない(今は)

用語整理と問題領域の理解が目的

95%はカバーできる

Page 66: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

参考)システム境界システムと外部との接点

どこからがシステムの機能・データなのか?

ユーザーインターフェイス(画面)

外部インターフェイス

ユーザ

システム境界

システム

外部システム機能 データ

Page 67: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

参考)入出力(なにを)入力

ファイル、フォームデータ

出力

画面、帳票、ファイルシステム境界

システム入力

出力

Page 68: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

モデリングの例

ざっくりと単語(名詞)を抽出

Page 69: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

モデリングの例

属性などを追加していく

Page 70: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

Enjoy Testing!

Page 71: TDD BootCamp in JJUG CCC - レガシーコード対策編 -

ハンズオンの進め方ひとつのメソッドを選んでテストしてみよう

テストケースを増やす?

別のメソッドをテストを書く?

仕様変更する?

上から下まで通すテストを書く?

TAに相談してみよう!