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

Preview:

DESCRIPTION

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

Citation preview

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

自己紹介

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

やさしいデスマーチ

JUnit実践入門

Java, Groovy, JavaScript, AWS, TDD

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

4刷!累計1万部

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

株式会社クラスメソッド

札幌にて在宅勤務

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

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

Spring, Ember.js, d3-data

ブログ業務

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

U/Iターン歓迎!

7月初旬 開設予定!

アプリ屋から 移籍可能

Special Thanks TA@i_takehiro

@grimrose

@sue445

@setoazusa

@torazuka

@uasano

@yujiorama

TDDBCへ ようこそ

http://devtesting.jp/tddbc/

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

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

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

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

レビュー大会は行わない

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

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

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

テスト駆動開発とは?

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

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

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

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

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

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

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

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

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

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

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

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

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

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

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

多重ネスト

巨大なクラス

多すぎる引数

多すぎる責務

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

レガシーコード!

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

2. 追加機能で増築する

3. 仕様変更で改築する

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

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

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

TDDで解決?

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

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

動かない 動く

きれい

汚い

1.設計する

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

2.テストを書く

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

3.コードを書く

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

4.テストを成功させる

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

5.リファクタリング

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

1.設計する

動かない 動く

きれい

汚い

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

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

テストによる安心

リファクタリング

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

TDDのこころ

©和田卓人

小さく  

個別に  

すばやく

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

大きなものは小さく分割

確実に、堅実に

手戻りを小さく

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

次のテストを作らない

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

早く回す

すぐに対応

リズム重要

1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

使う  

作る  

伝える

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

自分で評価する

納得できるか?

恥ずかしくないか?

解りやすいか?

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

プロとしてのこだわり

少しでも使いやすく

日々、研究・工夫

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

読みにくいコードは悪

シンプルに

名前重要

どうして、  

テスト駆動開発を  

導入するのか?

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

不安

スキル不足

複雑な要件

スキル不足

仕様変更

経験不足

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

安全を確保する

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

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

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

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

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

TDDが目指すところ

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

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

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

TDD!TDD!

テストファースト!

TDDは死んだ、無益だ!

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

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

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

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

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

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

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

Long live testing

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

レガシーコード体験NO TESTING

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

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

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

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

シングルトン

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

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

過去の編集履歴

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

Integerとintが混在

「なんでマイナス?」

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

スレッドセーフでない

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

ロガーが使われていない

例外処理

JavaDocがあったりなかったり

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

レガシーコード改善

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

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

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

クラス

クラス

クラス

ユニットテスト

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

やってられっか!?

仕様化テストだけで大変

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

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

そもそもバグが...

辛い、ただ辛い

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

深いネスト

巨大なクラス

多すぎる引数

多すぎる責務

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

浅いネスト

小さなクラス

適度な引数

適度な責務

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

設計麻痺に注意

モデリング+

テスト駆動開発

モデリング

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

As-Is から To-Be へ

大雑把に言えば「設計」

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

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

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

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

静的モデル

クラス図の基盤

Is-A

Has-A *

1

xxx

xxxxxx

xxx

xxx

*

1

xxx

*

1

*

1

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

用語を統一するため

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

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

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

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

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

95%はカバーできる

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

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

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

外部インターフェイス

ユーザ

システム境界

システム

外部システム機能 データ

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

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

出力

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

システム入力

出力

モデリングの例

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

モデリングの例

属性などを追加していく

Enjoy Testing!

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

テストケースを増やす?

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

仕様変更する?

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

TAに相談してみよう!