phpunit でテスト駆動開発を始めよう
DESCRIPTION
TRANSCRIPT
![Page 1: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/1.jpg)
PHPUnit でテスト駆動開発を
始めよう@yuya_takeyama
![Page 2: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/2.jpg)
このスライドは以前の発表を抜粋・再編集・加筆してお送りします
http://blog.yuyat.jp/archives/1386
![Page 3: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/3.jpg)
アジェンダ
•PHPUnit とは何か
•何故ユニットテストを書くか
•免責事項 (PHPUnit 的な意味で)
•蛇足 : オレはこう思う
![Page 4: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/4.jpg)
What’sPHPUnit?
![Page 5: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/5.jpg)
PHPUnit とは
•テスティングフレームワーク
•ユニットテストを書く
•比較的簡単に書ける
•多機能
![Page 6: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/6.jpg)
何故 PHPUnit か
•豊富なドキュメント
•日本語訳も充実(PHP マニュアルでもおなじみ高木正弘さん)
•豊富な利用実績 (ZF, Symfony2, etc)
![Page 7: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/7.jpg)
http://www.phpunit.de/manual/current/ja/
![Page 8: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/8.jpg)
http://www.phpunit.de/manual/current/ja/
これ読むだけでもかなり勉強になるのでオススメです
![Page 9: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/9.jpg)
class CalculatorTest extends PHPUnit_Framework_TestCase{ public function setUp() { $this->calc = new Calculator; }
public function test_add_引数の和を返す() { $result = $this->calc->add(1, 2); $this->assertSame(3, $result); }}
![Page 10: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/10.jpg)
class CalculatorTest extends PHPUnit_Framework_TestCase{ public function setUp() { $this->calc = new Calculator; }
public function test_add_引数の和を返す() { $result = $this->calc->add(1, 2); $this->assertSame(3, $result); }}
1
テストに必要な物の用意
![Page 11: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/11.jpg)
class CalculatorTest extends PHPUnit_Framework_TestCase{ public function setUp() { $this->calc = new Calculator; }
public function test_add_引数の和を返す() { $result = $this->calc->add(1, 2); $this->assertSame(3, $result); }}
2
テスト対象の実行
![Page 12: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/12.jpg)
class CalculatorTest extends PHPUnit_Framework_TestCase{ public function setUp() { $this->calc = new Calculator; }
public function test_add_引数の和を返す() { $result = $this->calc->add(1, 2); $this->assertSame(3, $result); }}
3
実行結果の検証 (アサーション)
![Page 13: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/13.jpg)
![Page 14: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/14.jpg)
![Page 15: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/15.jpg)
WhyUnit-test?
![Page 16: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/16.jpg)
ドキュメントとして
•Tests as Documentation
•API の一覧
•動作するサンプルコード
![Page 17: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/17.jpg)
回帰テストとして
•リグレッションテストともいう
•ある修正が新たなバグを生んでいないか
•同じ過ちを繰り返さないため
![Page 18: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/18.jpg)
リファクタリングとは
•振る舞いを帰ること無く
•ソースコードの内部構造を
•変更すること
•ソースコードの体質改善
![Page 19: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/19.jpg)
設計のためのテスト
•Test Driven Design
•ライブラリは API が 9 割
•API のユーザビリティテスト
•リファクタリングで継続的改
![Page 20: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/20.jpg)
テストは質のためならず
![Page 21: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/21.jpg)
設計のためのテスト•オブジェクト指向の原則や
•デザインパターンを武器に
•テスタビリティの高いコードを書き
•リファクタリングで継続的改
![Page 22: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/22.jpg)
テストを中心に据えることで機能・設計を継続的に改善することができる
![Page 23: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/23.jpg)
何故テストを書くか•ドキュメントとして
•回帰テストとして
•設計のため
•リファクタリングのため
•継続的改善のため
![Page 24: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/24.jpg)
免責事項(PHPUnit 的な意味で)
![Page 25: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/25.jpg)
テストを書けば全てが解決するわけではなく, テストを書くことで新たに起こる問題もある
![Page 26: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/26.jpg)
それらの問題を何でも PHPUnit や TDD のせいにするのではなく, 妥協点を見つける必要がある
![Page 27: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/27.jpg)
という話をします
![Page 28: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/28.jpg)
Q. テストを書いていたら開発工数が増えるんだが!!!
![Page 29: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/29.jpg)
A. 冗長化して書いているので当然です
![Page 30: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/30.jpg)
http://d.hatena.ne.jp/nowokay/20120222
![Page 31: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/31.jpg)
テストを書くポイントを選ぶ•やみくもに書けばいいというものではない
•品質が求められる部分
•頻繁に変更が起こり壊れやすい部分
•不安を感じる部分
•初期コストをかけることで, あとで回収できるかどうか
![Page 32: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/32.jpg)
テストもリスク/コスト
•テストを書く時間
•テストをメンテする時間
•コストに見合った対価が得られるか
•カバレッジが同じならテストは少ない方が良い
•可読性重要
![Page 33: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/33.jpg)
Q. テストを書いても開発が駆動 (Drive) されないのだが!!!
![Page 34: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/34.jpg)
A. 今作っているものに TDD がフィットしてないのでは?
![Page 35: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/35.jpg)
TDD が向かないもの
•自分が作ろうとしているものが全くイメージできない場合
•開発の初期段階で, 作ろうとしているもの自体がコロコロ変わる場合
•テストを書こうとすることで, これらの問題に早期に気づくことができる (という話もある)
![Page 36: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/36.jpg)
とりあえず動くものを作ることが大事
![Page 37: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/37.jpg)
http://d.hatena.ne.jp/sotarok/20120105/1325698126
![Page 38: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/38.jpg)
テストファーストが絶対ではない
(と, 個人的には思ってます)
![Page 39: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/39.jpg)
http://www.slideshare.net/t_wada/javaja-tdd-2nd
![Page 40: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/40.jpg)
テストは後からでも書けるし後からでも書くべき
![Page 41: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/41.jpg)
※やみくもにテストを書いて痛い目を見ることで得られるものがあることも付記しておきます
![Page 42: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/42.jpg)
蛇足 : オレはこう思う
![Page 43: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/43.jpg)
プログラマの「オレが全部書き直してやんよ!」病
について
![Page 44: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/44.jpg)
オレが全部(ry
•酷いレガシーコードの塊
•こんなの読んでられない!!
•全部書き直した方が早いのでは???
![Page 45: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/45.jpg)
オレが全部(ry
•酷いレガシーコードの塊
•こんなの読んでられない!!
•全部書き直した方が早いのでは???
本当にそれで
いいのか?
![Page 46: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/46.jpg)
解決したい問題は何か
![Page 47: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/47.jpg)
レガシーコードが抱える問題
•理解するのに時間がかかる
•ちょっと改修するとすぐ壊れる
•拡張が著しく困難
![Page 48: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/48.jpg)
要約すると
![Page 49: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/49.jpg)
レガシーコードが抱える問題
•「オレ」が気に入らない
![Page 50: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/50.jpg)
解決したい問題は何か
![Page 51: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/51.jpg)
全部書き換えればレガシーコードは無くなるのか
![Page 52: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/52.jpg)
短期的には Yes であることもある
![Page 53: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/53.jpg)
長期的には大体 No
![Page 54: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/54.jpg)
コードは腐る
![Page 55: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/55.jpg)
全部書き換える前にコードを腐らせない技術を身につける必要がある
![Page 56: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/56.jpg)
レガシーコードと
立ち向かう勇気
![Page 57: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/57.jpg)
...を, 身につけるためにこれの読書会とかしたいですね
![Page 58: PHPUnit でテスト駆動開発を始めよう](https://reader035.vdocuments.net/reader035/viewer/2022081800/54b515094a7959ed3f8b459a/html5/thumbnails/58.jpg)
ご清聴ありがとうございました