tdd を自分の道具にしよう
DESCRIPTION
わんくま同盟 名古屋勉強会#20(1/14)のLT資料です。http://www.wankuma.com/seminar/20120114nagoya20/TRANSCRIPT
![Page 1: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/1.jpg)
わんくま同盟 名古屋勉強会 #20
TDDを自分の道具にしよう
id:yujiorama
@yujiorama
![Page 2: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/2.jpg)
わんくま同盟 名古屋勉強会 #20
自己紹介
• 千葉から来ました(たぶん初めて?)
• n次請けシステム開発屋
• 技術リードみたいなことをしたり、PLみたいなことをしてます
• Cが好きです。C++はもっと好きです。
• (一番好きなのはRubyです)
![Page 3: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/3.jpg)
わんくま同盟 名古屋勉強会 #20
私たちの開発の進め方を変えてみませんか?
![Page 4: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/4.jpg)
わんくま同盟 名古屋勉強会 #20
アジェンダ
• 仕様化テストを書きましょう
• 設計しましょう
• リファクタリングをしましょう
• テストもリファクタリングしましょう
• テストが何を保証しているのか思い出しましょう
• 最終的に残るものを確認しましょう
![Page 5: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/5.jpg)
わんくま同盟 名古屋勉強会 #20
仕様化テストを書きましょう
![Page 6: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/6.jpg)
わんくま同盟 名古屋勉強会 #20
仕様が提示されるところから私たちの仕事が始まることが多いと思います。
(TDDBC や今回のワークショップではお題)
私たちが最初にすることは、仕様を動作可能なプログラム言語で表現することです。
![Page 7: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/7.jpg)
わんくま同盟 名古屋勉強会 #20
仕様化テストを書きましょう
• 仕様をテストケースにする
• テスト設計の観点でテストケースを追加する
![Page 8: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/8.jpg)
わんくま同盟 名古屋勉強会 #20
仕様をテストケースにする
仕様は、お客様が理解できなければいけないので自然言語や図を使って表現されます
私たちプログラマーは、この仕様をプログラミング言語で表現します。
何故でしょうか?
![Page 9: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/9.jpg)
わんくま同盟 名古屋勉強会 #20
仕様をテストケースにする
実行して、その振る舞いを検証することができるからです。
![Page 10: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/10.jpg)
わんくま同盟 名古屋勉強会 #20
仕様をテストケースにする
仕様を、プログラミング言語で忠実に表現することに注力しましょう。
あまりにも汚かったり冗長になってしまう場合は、組み込み DSL などの技法を適用しましょう。
大事なのは、後から読んでも理解しやすいテストケースを作成することです。
![Page 11: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/11.jpg)
わんくま同盟 名古屋勉強会 #20
テスト設計の観点
テストの設計という観点があります。
仕様から必要なテストを導き出すための大切な観点です。
同値分割、境界値分析、ドメイン分析などがよく使われると思います。
テスト設計の観点から導かれるテストケースを書きましょう。
![Page 12: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/12.jpg)
わんくま同盟 名古屋勉強会 #20
ところで
![Page 13: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/13.jpg)
わんくま同盟 名古屋勉強会 #20
仕様に対する理解は十分でしょうか? (まだ何のコードも書いていません!)
仕様に対する理解が曖昧な場合、分かっている
範囲で先に進んでまた戻ってくればよいと思います。
私は、それができるのが TDD の利点だと考えています
![Page 14: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/14.jpg)
わんくま同盟 名古屋勉強会 #20
設計しましょう
![Page 15: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/15.jpg)
わんくま同盟 名古屋勉強会 #20
仕様をプログラミング言語によってテストケースという形にすることができました。
コンパイルすら通らないかもしれません。
それも含めて、次にやらなければならないことを洗い出しましょう。
![Page 16: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/16.jpg)
わんくま同盟 名古屋勉強会 #20
設計しましょう
• タスクリストを書き出す
• タスクリストをテストにする
• 不安をテストにする
![Page 17: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/17.jpg)
わんくま同盟 名古屋勉強会 #20
タスクリストを書き出す
今、私たちが相手をしているのは、1 つの仕様 (という名のテストケース) です。
このテストケースが成功するために必要な事柄を思い付く限り洗い出しましょう。
「○○クラスを作る」
「△△メソッドを作る」
「☆☆関数を作る」…
![Page 18: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/18.jpg)
わんくま同盟 名古屋勉強会 #20
タスクリストを書き出す
大事なのは、1 つのタスクが完了することで、1 つのモノ・コトが出来あがっていることです
。
問題を分割するという行為を自然に行えるようになりましょう。
詳細は
「テストリストの見つけ方」
(@shuji_w6e さん)
を参考にしてください。
![Page 19: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/19.jpg)
わんくま同盟 名古屋勉強会 #20
タスクリストをテストケースにする
タスクの中には「●●というメソッドを作る」というものがあるかもしれません。
オブジェクト指向設計において、メソッドは 1 つの設計要素です。
入力と出力が明らかになっているなら、それを確認するためのテストケースを書きましょう。
![Page 20: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/20.jpg)
わんくま同盟 名古屋勉強会 #20
不安をテストにする
タスクの中には「■パターンで○クラスを作る」というものがあるかもしれません。
自分がよく使っているデザインパターンであれば、抑えるべきポイントは明らかかもしれませ
ん。
しかし、あまり使わないデザインパターン (Flighweight パターンとか) ではどうでしょう
か?
![Page 21: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/21.jpg)
わんくま同盟 名古屋勉強会 #20
不安をテストにする
私なら、ちゃんと書けているか自信がありません(=不安)。
考えたとおりの振る舞いになっているかどうかを確認するためのテストケースを書くこ
とでしょう。
![Page 22: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/22.jpg)
わんくま同盟 名古屋勉強会 #20
リファクタリングしましょう
![Page 23: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/23.jpg)
わんくま同盟 名古屋勉強会 #20
設計 (実装) ができてきました。
仕様化テストを通すための必要最低限の実装です。
ハードコーディングされた定数、if 文、while 文、などなど気になるところもあるでしょう。
![Page 24: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/24.jpg)
わんくま同盟 名古屋勉強会 #20
これらをきれいにして、保守しやすいコードにする営みがリファクタリングです。
リファタリングの最重要事項は、最終的に仕様化テストが成功することを維持しつつ、リファクタリングを行う前よりもコードをきれいにするこ
とです。
![Page 25: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/25.jpg)
わんくま同盟 名古屋勉強会 #20
リファクタリングしましょう
• 順を追って進める
• 新たなインターフェース境界ができたら
![Page 26: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/26.jpg)
わんくま同盟 名古屋勉強会 #20
順を追って進める
ここに至るまでのリズムはアレグロな感じだと思うので、リズムを変えましょう。
リファクタリングは、一歩一歩、順番を守って進めることが大事です。
その都度、テストを実行して、期待した通りの結果になることを確認しながら進めていきましょ
う。
![Page 27: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/27.jpg)
わんくま同盟 名古屋勉強会 #20
新たなインターフェース境界ができたら
リファクタリングをすると、新しいインターフェースやクラスが登場することがあります。
もし、インターフェースの境界が増えたのならば、そこに関するテストケースも追加しましょう。
![Page 28: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/28.jpg)
わんくま同盟 名古屋勉強会 #20
新たなインターフェース境界ができたら
インターフェースの境界は、拡張ポイントとして必要になるから発生したのだと考えられます。
拡張ポイントについて後からコードを追加していく人にとって、そのテストケースはよいサンプル
コードとなるでしょう。
![Page 29: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/29.jpg)
わんくま同盟 名古屋勉強会 #20
テストもリファクタリングしましょう
![Page 30: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/30.jpg)
わんくま同盟 名古屋勉強会 #20
仕様について設計(実装)が終わりました。
目の前には、設計段階で洗い出したタスクリストや、不安に対するテストが並んでいます。
これらを放置しておくと、あっという間にゴミのようになってしまいます。
![Page 31: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/31.jpg)
わんくま同盟 名古屋勉強会 #20
テストもリファクタリングしましょう
• 重複したテスト
• 同じフィクスチャーを使っているテスト
![Page 32: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/32.jpg)
わんくま同盟 名古屋勉強会 #20
重複したテスト
仕様化テストで動作の検証が済んでいるコードについては、設計時に作成したテストケースは
、ざっくりと削除してもよいかもしれません。
設計レベルでの変更があるかもしれない、という意味で、インターフェース境界のテストは残し
ておいたほうがよいでしょう。
![Page 33: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/33.jpg)
わんくま同盟 名古屋勉強会 #20
同じフィクスチャーを使っているテスト
同じフィクスチャーを使っているテストは、Shared Fixture パターンにリファクタリン
グするとよいでしょう。
詳細は
「xUnit Test Patterns」
(xUTP読書会Wiki)
を参照してください。
![Page 34: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/34.jpg)
わんくま同盟 名古屋勉強会 #20
テストが何を保証しているか確認しましょう
![Page 35: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/35.jpg)
わんくま同盟 名古屋勉強会 #20
「コードカバレッジは 100% です」これが何を意味するのか私には分かりません。
テストで全てのパスを通過していれば、問題は無いのでしょうか?
TDD で書いたテストは、「仕様についての理解度」、「設計に対する自信」を保証している
のです。
![Page 36: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/36.jpg)
わんくま同盟 名古屋勉強会 #20
テストが何を保証しているか確認しましょう
• テストカバレッジ
![Page 37: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/37.jpg)
わんくま同盟 名古屋勉強会 #20
テストカバレッジ
大事なのは、システム (コンポーネント) の振る舞いの定義域のうち、どれだけの領域がテストされているかを表す指標値です。
私はこれがテストカバレッジの定義だと思っているのですが、具体的な定義については知らないので、勉強しないといけないなと考えています。
![Page 38: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/38.jpg)
わんくま同盟 名古屋勉強会 #20
最終的に残るものを確認しましょう
![Page 39: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/39.jpg)
わんくま同盟 名古屋勉強会 #20
最終的に残るものを確認しましょう
回帰テストのために残すべきテストにはどういったものがあるでしょうか。
テストケースのリファクタリングによって数は減らされたとはいえ、これだけは
残しておきたいというものを挙げるとすると、次の 3 種類が残ります。
![Page 40: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/40.jpg)
わんくま同盟 名古屋勉強会 #20
最終的に残るものを確認しましょう
1. 仕様化テスト
2. インターフェース境界のテスト
3. テスト設計の観点で追加されたテスト
特に 3 のテストについては、品質保証 (Quality Assuarance) にも関連すると思うのですが、私はまだそこまでカバーできる知識が足りないので、識者の方に教えていただきたい分野です。
![Page 41: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/41.jpg)
わんくま同盟 名古屋勉強会 #20
以上です。
ご清聴ありがとうございました。
![Page 42: TDD を自分の道具にしよう](https://reader034.vdocuments.mx/reader034/viewer/2022052400/55980fed1a28ab431f8b45fd/html5/thumbnails/42.jpg)
わんくま同盟 名古屋勉強会 #20
宣伝
• 第6回 Growing Object-Oriented Software, Guided by Tests読書会( #goos_jp )– http://atnd.org/events/23826
– #goos_jp
• ぺけま 0004 号– http://devtesting.jp/pekema/
– #xutp
• インフラ&アプリエンジニア合同合宿– https://sites.google.com/site/infrapp2012/
– #infrapp2012