SlideShare a Scribd company logo
1 of 28
Download to read offline
PHPによるユニットテスト入門


     2009/04/22
    発表者:katsumic
本日の勉強会の目的
• ユニットテストについての知識を得る。
• PHPのテスティングフレームワーク、PHPUnitの
  基本的な使い方を学ぶ。
本日の内容
1.ユニットテストの概要
2.PHPのユニットテスティングフレームワーク
3.PHPUnitを使ってみよう
1.ユニットテストの概要
1-1.ユニットテストとは
• ソフトウェアのテスト手法の一つで、個々のモ
  ジュール(関数などの部品)単位で仕様書の要求
  通りに動作するかのテスト。
• =単体テスト(情報処理の試験用語としてはこっ
  ちかも。未確認)
1-2.具体的にどうする
• 現在は何らかのツール(テスティングフレーム
  ワーク)を利用してテストケースを作成して行うの
  が主流。
• ここで言うテストケースとは
 – テストを行う際に、プログラムにどのような入力を与え、
   その結果としてどのような出力が得られるべきかを記
   述したもの(Wikipedia「テスト自動化」より)。
 – 後述のPHPUnitであれば、それをクラスとして実装す
   る。
1-3.フレームワークのメリット
• テストをする為の基本的な機能がまとまっている
  為、テストケースの作成が容易になる。
• 一定のルールに沿う事になるので、各プログラ
  マーが一貫した方法でテストできる。
• 1度テストケースを作成しておけば、リファクタリン
  グを行う際に再利用できる(ミス無く利ファクタリン
  グできていれば全てのテストに成功するはず)。
2.PHPのユニットテスティング
     フレームワーク
• PHPUnit
  – xUnitファミリーに分類される代表的なフレームワーク。
     • xUnitはSmalltalk用のSUnitから派生した。
     • 中でもJAVA用のJUnitがおそらく一番有名。
  – バージョン2.3以降はPHP5専用(現在の安定版は3.3)
  – 現在も活発に開発されている(次期バージョンは4.0)
  – 今回扱うのはこれ!

• SimpleTest
  – こちらも同じxUnit系。
  – PHPUnitと何が違う?
     • こめんなさい、まだ試してません・・・。
  – PHP4でも動作するらしい。
  – 2008年4月以降、リリースが滞っているようです。
• lime
  – WEBアプリケーションフレームワーク「Symfony」に
    同梱されている。
  – PHPUnitやSimpleTestより単純なテストを前提とし
    ており、導入コストが低いらしい。
     • ごめんなさい、これもちゃんと調べてないので・・・
  – 詳しくはSymfonyユーザーに聞こう。
• DocTest(Maple4_DocTest)
  – テストケースをソースコードのコメントに特殊な記法で
    記述するという形式。
  – Pythonでは標準のフレームワークで、それを移植し
    た物。
  – 幾つか実装があるようだが、 Maple4_DocTestが有
    力。実は裏ではPHPUnitを利用している。
  – 少しだけ試してみた所、複雑なテストケースは記述し
    づらいと思ったが、ソースコードと同じファイルに直接
    書ける手軽さは魅力に感じた。
  – 反面、ソースコード中にテストコードが混在するのと等
    しいので、ソースの可読性は落ちる。トレードオフをよく
    考えるべき。
3.PHPUnitを使ってみよう
3-1.インストール
• PEARを利用する
 – PEARチャネルの変更
  # pear channel-discover pear.phpunit.de
 – PEARコマンドでインストール
  # pear install phpunit/PHPUnit
• 簡単!
 ※Windowsの場合はPEAR自体の準備もしないといけ
  ないですが・・・
3-2.テストケースの作成
• 実装する(あるいは既にしてある)クラスの仕様に合わせ
  てテストクラスを作成する。
 – 例えば「Class」という名前のクラスのテストは、「ClassTest」とい
   う名前のクラスに記述する。
 – テストクラスはほとんどの場合、
   PHPUnit_Framework_TestCaseクラスを継承して作成
 – テストは、「test****()」という名前のpublicメソッドとして実装す
   るか、メソッドのコメントにアノテーション「@test」 を宣言する。
 – テストメソッドの中で「assert****()」のようなアサーションメソッ
   ドを使用して、出力が期待通りであるか確かめる。
3-3.まずは書き方
• テスト対象は以下のクラス
 <?php
 class Counter
 {
    private $count = 0;

   // $count を1増加させる(はずだが見てのとおり実際は何もしてない)
   public function increment() {
      ;
   }

   // 現在のカウントを返す
   public function count() {
      return $this->count;
   }
 }
 ?>
• テストクラスは以下のとおり
 <?php
 require_once ‘PHPUnit/Framework.php’; ①
 require_once ‘Counter.php’; ②

 class CounterTest extends PHPUnit_Framework_TestCase ③
 {
    // カウントが0である事を検証するテストメソッド
    public function testCountIsZero() ④
    {
       $counter = new counter();

       $this->assertEquals(0, $counter->count()); ⑤
   }
 }
 ?>
①PHPUnitクラスの読み込み。
②テスト対象のクラスの読み込み。
③テストクラスは
 PHPUnit_Framework_TestCaseを継承する。
④テストメソッドは「test****」で始まる。
⑤アサーションメソッド。
 ここでは2つの値が同じであるか検証する
 「assertEquals」メソッドを使用している。
3-4.テストの実行
• テストはphpunitコマンドで実行
 – テストクラスのファイル名が「クラス名.php」の場合はク
   ラス名だけを引数として渡す。
  $ phpunit CounterTest

 – テストクラス名とファイル名が異なる場合はファイル名
   も指定する。
  $ phpunit CounterTest CounterTest1.php
3-5.テスト結果1
• 成功した場合の結果
 PHPUnit 3.3.15 by Sebastian Bergmann.

 .

 Time: 0 seconds

 OK (1 test, 1 assertion)
3-6.テストケースの追加
• 仕様通りなら以下のケースを追加しても成功する
  はず
  // カウントが1だけ増加した事を検証するテストメソッド
  public function testCountIncrementOnce()
  {
     $counter = new counter();

      $counter->increment();

      $this->assertEquals(1, $counter->count()) ;
  }
3-7.テスト結果2
• 失敗した場合の結果
 PHPUnit 3.3.15 by Sebastian Bergmann.

 .F

 Time: 0 seconds

 There was 1 failure:

 1) testCountIncrementOnce(CounterTest)
 Failed asserting that <integer:0> matches expected value <integer:1>.
 /home/katsumi/div3-sys_workshop/ex/CounterTest2.php:22

 FAILURES!
 Tests: 2, Assertions: 2, Failures: 1.
3-8.バグ修正
• なぜ失敗したかと言えば
 – 見ての通り、incrementメソッドの不備が原因
• 以下のように実装すればもちろん解決
  // $count を1増加させる
  public function increment () {
     $this->count++;
  }
3-9.再テスト
• 修正によって解決!
 PHPUnit 3.3.15 by Sebastian Bergmann.

 .

 Time: 0 seconds

 OK (2 test, 2 assertion)
3-10.手順の確認
• 基本的には以下のようなフローの繰り返し
 – 仕様に合わせたテストクラスを実装。
 – 要求されている機能を実装。
 – ユニットテストを実行。
 – エラーが発生したら修正。
 – 再テスト。
• もちろんテストクラスと要求機能の実装が前後す
  る場合もあり。
本日のまとめ
• テスティングフレームワークを利用するとテスト
  ケースの作成も楽になり、ユニットテストを容易に
  できる。
• PHPUnitもごく簡単なテストケースならすぐに作
  成できる。
• ただし、実際に活用するなら開発の前に仕様をで
  きるだけ明確化しておくことが望ましい。
• そうすれば最初から多くのテストケースを準備す
  る事ができる → テスト駆動開発へ。
今後の課題
• PHPUnitの機能自体まだ一部しか使っていない
  のでさらに活用できるようにする。
• 他のテスティングフレームワークも試してみる
  (DocTestは特に)。
参考資料
• PHPUnit公式サイトマニュアル
  – http://www.phpunit.de/manual/3.3/ja/index
    .html
• PHPプロ!の記事
  – http://www.phppro.jp/school/test/
• gihyo.jpの記事
  – http://gihyo.jp/dev/feature/01/php-test
ご清聴、ありがとうございました!

More Related Content

What's hot

P101 B04
P101 B04P101 B04
P101 B04jingger
 
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収Hiroshi Tokumaru
 
TracWysiwygPlugin
TracWysiwygPluginTracWysiwygPlugin
TracWysiwygPluginJun Omae
 
eLearning Manager4U
eLearning Manager4UeLearning Manager4U
eLearning Manager4Uguestd83ce7
 
Howtousenetboss
HowtousenetbossHowtousenetboss
Howtousenetbosskumee
 
OSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group JapanOSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group JapanKenichi 深海
 
SocialWeb勉強会 Vol.1
SocialWeb勉強会 Vol.1SocialWeb勉強会 Vol.1
SocialWeb勉強会 Vol.1Eiji Kitamura
 
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」icchu3
 
WebHookの調査と実装
WebHookの調査と実装WebHookの調査と実装
WebHookの調査と実装moai kids
 
JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009
JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009
JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009Yusuke Kawasaki
 
Fmrms Whitepaper.Cnaa
Fmrms Whitepaper.CnaaFmrms Whitepaper.Cnaa
Fmrms Whitepaper.Cnaajijiegg
 
ใบงาน4
ใบงาน4ใบงาน4
ใบงาน4benz13749
 
FlashMediaServer3開発環境の準備
FlashMediaServer3開発環境の準備FlashMediaServer3開発環境の準備
FlashMediaServer3開発環境の準備toyoshi
 
Web技術勉強会10回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)Web技術勉強会10回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)龍一 田中
 
Developers[Media]Summit 2009
Developers[Media]Summit 2009Developers[Media]Summit 2009
Developers[Media]Summit 2009Akiko Iwakiri
 
A Glance At Web 2.0
A Glance At Web 2.0A Glance At Web 2.0
A Glance At Web 2.0Chiong
 
インフラエンジニアになろう!
インフラエンジニアになろう!インフラエンジニアになろう!
インフラエンジニアになろう!Toshiaki Baba
 

What's hot (20)

P101 B04
P101 B04P101 B04
P101 B04
 
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
 
TracWysiwygPlugin
TracWysiwygPluginTracWysiwygPlugin
TracWysiwygPlugin
 
eLearning Manager4U
eLearning Manager4UeLearning Manager4U
eLearning Manager4U
 
91 Ch
91 Ch91 Ch
91 Ch
 
Howtousenetboss
HowtousenetbossHowtousenetboss
Howtousenetboss
 
OSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group JapanOSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group Japan
 
SocialWeb勉強会 Vol.1
SocialWeb勉強会 Vol.1SocialWeb勉強会 Vol.1
SocialWeb勉強会 Vol.1
 
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
 
WebHookの調査と実装
WebHookの調査と実装WebHookの調査と実装
WebHookの調査と実装
 
JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009
JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009
JUI Conference "Flashはもういらない!?" Adobe MAX Japan 2009
 
Fmrms Whitepaper.Cnaa
Fmrms Whitepaper.CnaaFmrms Whitepaper.Cnaa
Fmrms Whitepaper.Cnaa
 
ใบงาน4
ใบงาน4ใบงาน4
ใบงาน4
 
FlashMediaServer3開発環境の準備
FlashMediaServer3開発環境の準備FlashMediaServer3開発環境の準備
FlashMediaServer3開発環境の準備
 
Web技術勉強会10回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)Web技術勉強会10回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)
 
Trac 開発事例
Trac 開発事例Trac 開発事例
Trac 開発事例
 
Developers[Media]Summit 2009
Developers[Media]Summit 2009Developers[Media]Summit 2009
Developers[Media]Summit 2009
 
A Glance At Web 2.0
A Glance At Web 2.0A Glance At Web 2.0
A Glance At Web 2.0
 
MW Snap
MW SnapMW Snap
MW Snap
 
インフラエンジニアになろう!
インフラエンジニアになろう!インフラエンジニアになろう!
インフラエンジニアになろう!
 

More from Hiromu Shioya

不惑の生存戦略
不惑の生存戦略不惑の生存戦略
不惑の生存戦略Hiromu Shioya
 
珍獣 素人 そして くのいち
珍獣 素人 そして くのいち珍獣 素人 そして くのいち
珍獣 素人 そして くのいちHiromu Shioya
 
Rubyistが歩むべき道への道
Rubyistが歩むべき道への道Rubyistが歩むべき道への道
Rubyistが歩むべき道への道Hiromu Shioya
 
自宅で本気を出さされた
自宅で本気を出さされた自宅で本気を出さされた
自宅で本気を出さされたHiromu Shioya
 
クマとデバッグを
クマとデバッグをクマとデバッグを
クマとデバッグをHiromu Shioya
 
クマとジャーニーマンとステマ
クマとジャーニーマンとステマクマとジャーニーマンとステマ
クマとジャーニーマンとステマHiromu Shioya
 
お前の本気を見せてみろ!
お前の本気を見せてみろ!お前の本気を見せてみろ!
お前の本気を見せてみろ!Hiromu Shioya
 
Git道場を開催してきた
Git道場を開催してきたGit道場を開催してきた
Git道場を開催してきたHiromu Shioya
 
三周まわったおれたちのアジャイル
三周まわったおれたちのアジャイル三周まわったおれたちのアジャイル
三周まわったおれたちのアジャイルHiromu Shioya
 
俺たちの目指すモバイルの新たな地平
俺たちの目指すモバイルの新たな地平俺たちの目指すモバイルの新たな地平
俺たちの目指すモバイルの新たな地平Hiromu Shioya
 
ベジェ曲線を書いてみた
ベジェ曲線を書いてみたベジェ曲線を書いてみた
ベジェ曲線を書いてみたHiromu Shioya
 
オススメの技術書
オススメの技術書オススメの技術書
オススメの技術書Hiromu Shioya
 
はじめて学ぶバージョン管理とGit
はじめて学ぶバージョン管理とGitはじめて学ぶバージョン管理とGit
はじめて学ぶバージョン管理とGitHiromu Shioya
 
肉とRubyとわたし
肉とRubyとわたし肉とRubyとわたし
肉とRubyとわたしHiromu Shioya
 

More from Hiromu Shioya (20)

不惑の生存戦略
不惑の生存戦略不惑の生存戦略
不惑の生存戦略
 
勉強会なう
勉強会なう勉強会なう
勉強会なう
 
LTの技術
LTの技術LTの技術
LTの技術
 
珍獣 素人 そして くのいち
珍獣 素人 そして くのいち珍獣 素人 そして くのいち
珍獣 素人 そして くのいち
 
夏夏
 
Tupperware
TupperwareTupperware
Tupperware
 
Rubyistが歩むべき道への道
Rubyistが歩むべき道への道Rubyistが歩むべき道への道
Rubyistが歩むべき道への道
 
自宅で本気を出さされた
自宅で本気を出さされた自宅で本気を出さされた
自宅で本気を出さされた
 
クマとデバッグを
クマとデバッグをクマとデバッグを
クマとデバッグを
 
クマとジャーニーマンとステマ
クマとジャーニーマンとステマクマとジャーニーマンとステマ
クマとジャーニーマンとステマ
 
お前の本気を見せてみろ!
お前の本気を見せてみろ!お前の本気を見せてみろ!
お前の本気を見せてみろ!
 
Git道場を開催してきた
Git道場を開催してきたGit道場を開催してきた
Git道場を開催してきた
 
三周まわったおれたちのアジャイル
三周まわったおれたちのアジャイル三周まわったおれたちのアジャイル
三周まわったおれたちのアジャイル
 
俺たちの目指すモバイルの新たな地平
俺たちの目指すモバイルの新たな地平俺たちの目指すモバイルの新たな地平
俺たちの目指すモバイルの新たな地平
 
2011年の漢字
2011年の漢字2011年の漢字
2011年の漢字
 
ベジェ曲線を書いてみた
ベジェ曲線を書いてみたベジェ曲線を書いてみた
ベジェ曲線を書いてみた
 
オススメの技術書
オススメの技術書オススメの技術書
オススメの技術書
 
はじめて学ぶバージョン管理とGit
はじめて学ぶバージョン管理とGitはじめて学ぶバージョン管理とGit
はじめて学ぶバージョン管理とGit
 
肉とRubyとわたし
肉とRubyとわたし肉とRubyとわたし
肉とRubyとわたし
 
祝辞
祝辞祝辞
祝辞
 

PHPによるユニットテスト入門