phpunit でテスト駆動開発を始めよう

58
PHPUnit で テスト駆動開発を 始めよう @yuya_takeyama

Upload: yuya-takeyama

Post on 13-Jan-2015

21.685 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: PHPUnit でテスト駆動開発を始めよう

PHPUnit でテスト駆動開発を

始めよう@yuya_takeyama

Page 2: PHPUnit でテスト駆動開発を始めよう

このスライドは以前の発表を抜粋・再編集・加筆してお送りします

http://blog.yuyat.jp/archives/1386

Page 3: PHPUnit でテスト駆動開発を始めよう

アジェンダ

•PHPUnit とは何か

•何故ユニットテストを書くか

•免責事項 (PHPUnit 的な意味で)

•蛇足 : オレはこう思う

Page 4: PHPUnit でテスト駆動開発を始めよう

What’sPHPUnit?

Page 5: PHPUnit でテスト駆動開発を始めよう

PHPUnit とは

•テスティングフレームワーク

•ユニットテストを書く

•比較的簡単に書ける

•多機能

Page 6: PHPUnit でテスト駆動開発を始めよう

何故 PHPUnit か

•豊富なドキュメント

•日本語訳も充実(PHP マニュアルでもおなじみ高木正弘さん)

•豊富な利用実績 (ZF, Symfony2, etc)

Page 8: PHPUnit でテスト駆動開発を始めよう

http://www.phpunit.de/manual/current/ja/

これ読むだけでもかなり勉強になるのでオススメです

Page 9: PHPUnit でテスト駆動開発を始めよう

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 でテスト駆動開発を始めよう

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 でテスト駆動開発を始めよう

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 でテスト駆動開発を始めよう

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 でテスト駆動開発を始めよう
Page 14: PHPUnit でテスト駆動開発を始めよう
Page 15: PHPUnit でテスト駆動開発を始めよう

WhyUnit-test?

Page 16: PHPUnit でテスト駆動開発を始めよう

ドキュメントとして

•Tests as Documentation

•API の一覧

•動作するサンプルコード

Page 17: PHPUnit でテスト駆動開発を始めよう

回帰テストとして

•リグレッションテストともいう

•ある修正が新たなバグを生んでいないか

•同じ過ちを繰り返さないため

Page 18: PHPUnit でテスト駆動開発を始めよう

リファクタリングとは

•振る舞いを帰ること無く

•ソースコードの内部構造を

•変更すること

•ソースコードの体質改善

Page 19: PHPUnit でテスト駆動開発を始めよう

設計のためのテスト

•Test Driven Design

•ライブラリは API が 9 割

•API のユーザビリティテスト

•リファクタリングで継続的改

Page 20: PHPUnit でテスト駆動開発を始めよう

テストは質のためならず

Page 21: PHPUnit でテスト駆動開発を始めよう

設計のためのテスト•オブジェクト指向の原則や

•デザインパターンを武器に

•テスタビリティの高いコードを書き

•リファクタリングで継続的改

Page 22: PHPUnit でテスト駆動開発を始めよう

テストを中心に据えることで機能・設計を継続的に改善することができる

Page 23: PHPUnit でテスト駆動開発を始めよう

何故テストを書くか•ドキュメントとして

•回帰テストとして

•設計のため

•リファクタリングのため

•継続的改善のため

Page 24: PHPUnit でテスト駆動開発を始めよう

免責事項(PHPUnit 的な意味で)

Page 25: PHPUnit でテスト駆動開発を始めよう

テストを書けば全てが解決するわけではなく, テストを書くことで新たに起こる問題もある

Page 26: PHPUnit でテスト駆動開発を始めよう

それらの問題を何でも PHPUnit や TDD のせいにするのではなく, 妥協点を見つける必要がある

Page 27: PHPUnit でテスト駆動開発を始めよう

という話をします

Page 28: PHPUnit でテスト駆動開発を始めよう

Q. テストを書いていたら開発工数が増えるんだが!!!

Page 29: PHPUnit でテスト駆動開発を始めよう

A. 冗長化して書いているので当然です

Page 31: PHPUnit でテスト駆動開発を始めよう

テストを書くポイントを選ぶ•やみくもに書けばいいというものではない

•品質が求められる部分

•頻繁に変更が起こり壊れやすい部分

•不安を感じる部分

•初期コストをかけることで, あとで回収できるかどうか

Page 32: PHPUnit でテスト駆動開発を始めよう

テストもリスク/コスト

•テストを書く時間

•テストをメンテする時間

•コストに見合った対価が得られるか

•カバレッジが同じならテストは少ない方が良い

•可読性重要

Page 33: PHPUnit でテスト駆動開発を始めよう

Q. テストを書いても開発が駆動 (Drive) されないのだが!!!

Page 34: PHPUnit でテスト駆動開発を始めよう

A. 今作っているものに TDD がフィットしてないのでは?

Page 35: PHPUnit でテスト駆動開発を始めよう

TDD が向かないもの

•自分が作ろうとしているものが全くイメージできない場合

•開発の初期段階で, 作ろうとしているもの自体がコロコロ変わる場合

•テストを書こうとすることで, これらの問題に早期に気づくことができる (という話もある)

Page 36: PHPUnit でテスト駆動開発を始めよう

とりあえず動くものを作ることが大事

Page 38: PHPUnit でテスト駆動開発を始めよう

テストファーストが絶対ではない

(と, 個人的には思ってます)

Page 40: PHPUnit でテスト駆動開発を始めよう

テストは後からでも書けるし後からでも書くべき

Page 41: PHPUnit でテスト駆動開発を始めよう

※やみくもにテストを書いて痛い目を見ることで得られるものがあることも付記しておきます

Page 42: PHPUnit でテスト駆動開発を始めよう

蛇足 : オレはこう思う

Page 43: PHPUnit でテスト駆動開発を始めよう

プログラマの「オレが全部書き直してやんよ!」病

について

Page 44: PHPUnit でテスト駆動開発を始めよう

オレが全部(ry

•酷いレガシーコードの塊

•こんなの読んでられない!!

•全部書き直した方が早いのでは???

Page 45: PHPUnit でテスト駆動開発を始めよう

オレが全部(ry

•酷いレガシーコードの塊

•こんなの読んでられない!!

•全部書き直した方が早いのでは???

本当にそれで

いいのか?

Page 46: PHPUnit でテスト駆動開発を始めよう

解決したい問題は何か

Page 47: PHPUnit でテスト駆動開発を始めよう

レガシーコードが抱える問題

•理解するのに時間がかかる

•ちょっと改修するとすぐ壊れる

•拡張が著しく困難

Page 48: PHPUnit でテスト駆動開発を始めよう

要約すると

Page 49: PHPUnit でテスト駆動開発を始めよう

レガシーコードが抱える問題

•「オレ」が気に入らない

Page 50: PHPUnit でテスト駆動開発を始めよう

解決したい問題は何か

Page 51: PHPUnit でテスト駆動開発を始めよう

全部書き換えればレガシーコードは無くなるのか

Page 52: PHPUnit でテスト駆動開発を始めよう

短期的には Yes であることもある

Page 53: PHPUnit でテスト駆動開発を始めよう

長期的には大体 No

Page 54: PHPUnit でテスト駆動開発を始めよう

コードは腐る

Page 55: PHPUnit でテスト駆動開発を始めよう

全部書き換える前にコードを腐らせない技術を身につける必要がある

Page 56: PHPUnit でテスト駆動開発を始めよう

レガシーコードと

立ち向かう勇気

Page 58: PHPUnit でテスト駆動開発を始めよう

ご清聴ありがとうございました