Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PHPによるユニットテスト入門


     2009/04/22
    発表者:katsumic
本日の勉強会の目的
• ユニットテストについての知識を得る。
• PHPのテスティングフレームワーク、PHPUnitの
  基本的な使い方を学ぶ。
本日の内容
1.ユニットテストの概要
2.PHPのユニットテスティングフレームワーク
3.PHPUnitを使ってみよう
1.ユニットテストの概要
1-1.ユニットテストとは
• ソフトウェアのテスト手法の一つで、個々のモ
  ジュール(関数などの部品)単位で仕様書の要求
  通りに動作するかのテスト。
• =単体テスト(情報処理の試験用語としてはこっ
  ちかも。未確認)
1-2.具体的にどうする
• 現在は何らかのツール(テスティングフレーム
  ワーク)を利用してテストケースを作成して行うの
  が主流。
• ここで言うテストケースとは
 – テストを行う際に、プログラムにどのような入力を与え、
   その結...
1-3.フレームワークのメリット
• テストをする為の基本的な機能がまとまっている
  為、テストケースの作成が容易になる。
• 一定のルールに沿う事になるので、各プログラ
  マーが一貫した方法でテストできる。
• 1度テストケースを作成して...
2.PHPのユニットテスティング
     フレームワーク
• PHPUnit
  – xUnitファミリーに分類される代表的なフレームワーク。
     • xUnitはSmalltalk用のSUnitから派生した。
     • 中でもJAVA用のJUnitがおそらく一番有名。
  – バージョン2...
• lime
  – WEBアプリケーションフレームワーク「Symfony」に
    同梱されている。
  – PHPUnitやSimpleTestより単純なテストを前提とし
    ており、導入コストが低いらしい。
     • ごめんなさ...
• DocTest(Maple4_DocTest)
  – テストケースをソースコードのコメントに特殊な記法で
    記述するという形式。
  – Pythonでは標準のフレームワークで、それを移植し
    た物。
  – 幾つか実装がある...
3.PHPUnitを使ってみよう
3-1.インストール
• PEARを利用する
 – PEARチャネルの変更
  # pear channel-discover pear.phpunit.de
 – PEARコマンドでインストール
  # pear install phpuni...
3-2.テストケースの作成
• 実装する(あるいは既にしてある)クラスの仕様に合わせ
  てテストクラスを作成する。
 – 例えば「Class」という名前のクラスのテストは、「ClassTest」とい
   う名前のクラスに記述する。
 – テ...
3-3.まずは書き方
• テスト対象は以下のクラス
 <?php
 class Counter
 {
    private $count = 0;

   // $count を1増加させる(はずだが見てのとおり実際は何もしてない)
   p...
• テストクラスは以下のとおり
 <?php
 require_once ‘PHPUnit/Framework.php’; ①
 require_once ‘Counter.php’; ②

 class CounterTest extends...
①PHPUnitクラスの読み込み。
②テスト対象のクラスの読み込み。
③テストクラスは
 PHPUnit_Framework_TestCaseを継承する。
④テストメソッドは「test****」で始まる。
⑤アサーションメソッド。
 ここでは2...
3-4.テストの実行
• テストはphpunitコマンドで実行
 – テストクラスのファイル名が「クラス名.php」の場合はク
   ラス名だけを引数として渡す。
  $ phpunit CounterTest

 – テストクラス名とファイル...
3-5.テスト結果1
• 成功した場合の結果
 PHPUnit 3.3.15 by Sebastian Bergmann.

 .

 Time: 0 seconds

 OK (1 test, 1 assertion)
3-6.テストケースの追加
• 仕様通りなら以下のケースを追加しても成功する
  はず
  // カウントが1だけ増加した事を検証するテストメソッド
  public function testCountIncrementOnce()
  {
...
3-7.テスト結果2
• 失敗した場合の結果
 PHPUnit 3.3.15 by Sebastian Bergmann.

 .F

 Time: 0 seconds

 There was 1 failure:

 1) testCount...
3-8.バグ修正
• なぜ失敗したかと言えば
 – 見ての通り、incrementメソッドの不備が原因
• 以下のように実装すればもちろん解決
  // $count を1増加させる
  public function increment ()...
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/scho...
ご清聴、ありがとうございました!
Upcoming SlideShare
Loading in …5
×

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

14,307 views

Published on

  • Be the first to comment

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

  1. 1. PHPによるユニットテスト入門 2009/04/22 発表者:katsumic
  2. 2. 本日の勉強会の目的 • ユニットテストについての知識を得る。 • PHPのテスティングフレームワーク、PHPUnitの 基本的な使い方を学ぶ。
  3. 3. 本日の内容 1.ユニットテストの概要 2.PHPのユニットテスティングフレームワーク 3.PHPUnitを使ってみよう
  4. 4. 1.ユニットテストの概要
  5. 5. 1-1.ユニットテストとは • ソフトウェアのテスト手法の一つで、個々のモ ジュール(関数などの部品)単位で仕様書の要求 通りに動作するかのテスト。 • =単体テスト(情報処理の試験用語としてはこっ ちかも。未確認)
  6. 6. 1-2.具体的にどうする • 現在は何らかのツール(テスティングフレーム ワーク)を利用してテストケースを作成して行うの が主流。 • ここで言うテストケースとは – テストを行う際に、プログラムにどのような入力を与え、 その結果としてどのような出力が得られるべきかを記 述したもの(Wikipedia「テスト自動化」より)。 – 後述のPHPUnitであれば、それをクラスとして実装す る。
  7. 7. 1-3.フレームワークのメリット • テストをする為の基本的な機能がまとまっている 為、テストケースの作成が容易になる。 • 一定のルールに沿う事になるので、各プログラ マーが一貫した方法でテストできる。 • 1度テストケースを作成しておけば、リファクタリン グを行う際に再利用できる(ミス無く利ファクタリン グできていれば全てのテストに成功するはず)。
  8. 8. 2.PHPのユニットテスティング フレームワーク
  9. 9. • PHPUnit – xUnitファミリーに分類される代表的なフレームワーク。 • xUnitはSmalltalk用のSUnitから派生した。 • 中でもJAVA用のJUnitがおそらく一番有名。 – バージョン2.3以降はPHP5専用(現在の安定版は3.3) – 現在も活発に開発されている(次期バージョンは4.0) – 今回扱うのはこれ! • SimpleTest – こちらも同じxUnit系。 – PHPUnitと何が違う? • こめんなさい、まだ試してません・・・。 – PHP4でも動作するらしい。 – 2008年4月以降、リリースが滞っているようです。
  10. 10. • lime – WEBアプリケーションフレームワーク「Symfony」に 同梱されている。 – PHPUnitやSimpleTestより単純なテストを前提とし ており、導入コストが低いらしい。 • ごめんなさい、これもちゃんと調べてないので・・・ – 詳しくはSymfonyユーザーに聞こう。
  11. 11. • DocTest(Maple4_DocTest) – テストケースをソースコードのコメントに特殊な記法で 記述するという形式。 – Pythonでは標準のフレームワークで、それを移植し た物。 – 幾つか実装があるようだが、 Maple4_DocTestが有 力。実は裏ではPHPUnitを利用している。 – 少しだけ試してみた所、複雑なテストケースは記述し づらいと思ったが、ソースコードと同じファイルに直接 書ける手軽さは魅力に感じた。 – 反面、ソースコード中にテストコードが混在するのと等 しいので、ソースの可読性は落ちる。トレードオフをよく 考えるべき。
  12. 12. 3.PHPUnitを使ってみよう
  13. 13. 3-1.インストール • PEARを利用する – PEARチャネルの変更 # pear channel-discover pear.phpunit.de – PEARコマンドでインストール # pear install phpunit/PHPUnit • 簡単! ※Windowsの場合はPEAR自体の準備もしないといけ ないですが・・・
  14. 14. 3-2.テストケースの作成 • 実装する(あるいは既にしてある)クラスの仕様に合わせ てテストクラスを作成する。 – 例えば「Class」という名前のクラスのテストは、「ClassTest」とい う名前のクラスに記述する。 – テストクラスはほとんどの場合、 PHPUnit_Framework_TestCaseクラスを継承して作成 – テストは、「test****()」という名前のpublicメソッドとして実装す るか、メソッドのコメントにアノテーション「@test」 を宣言する。 – テストメソッドの中で「assert****()」のようなアサーションメソッ ドを使用して、出力が期待通りであるか確かめる。
  15. 15. 3-3.まずは書き方 • テスト対象は以下のクラス <?php class Counter { private $count = 0; // $count を1増加させる(はずだが見てのとおり実際は何もしてない) public function increment() { ; } // 現在のカウントを返す public function count() { return $this->count; } } ?>
  16. 16. • テストクラスは以下のとおり <?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()); ⑤ } } ?>
  17. 17. ①PHPUnitクラスの読み込み。 ②テスト対象のクラスの読み込み。 ③テストクラスは PHPUnit_Framework_TestCaseを継承する。 ④テストメソッドは「test****」で始まる。 ⑤アサーションメソッド。 ここでは2つの値が同じであるか検証する 「assertEquals」メソッドを使用している。
  18. 18. 3-4.テストの実行 • テストはphpunitコマンドで実行 – テストクラスのファイル名が「クラス名.php」の場合はク ラス名だけを引数として渡す。 $ phpunit CounterTest – テストクラス名とファイル名が異なる場合はファイル名 も指定する。 $ phpunit CounterTest CounterTest1.php
  19. 19. 3-5.テスト結果1 • 成功した場合の結果 PHPUnit 3.3.15 by Sebastian Bergmann. . Time: 0 seconds OK (1 test, 1 assertion)
  20. 20. 3-6.テストケースの追加 • 仕様通りなら以下のケースを追加しても成功する はず // カウントが1だけ増加した事を検証するテストメソッド public function testCountIncrementOnce() { $counter = new counter(); $counter->increment(); $this->assertEquals(1, $counter->count()) ; }
  21. 21. 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.
  22. 22. 3-8.バグ修正 • なぜ失敗したかと言えば – 見ての通り、incrementメソッドの不備が原因 • 以下のように実装すればもちろん解決 // $count を1増加させる public function increment () { $this->count++; }
  23. 23. 3-9.再テスト • 修正によって解決! PHPUnit 3.3.15 by Sebastian Bergmann. . Time: 0 seconds OK (2 test, 2 assertion)
  24. 24. 3-10.手順の確認 • 基本的には以下のようなフローの繰り返し – 仕様に合わせたテストクラスを実装。 – 要求されている機能を実装。 – ユニットテストを実行。 – エラーが発生したら修正。 – 再テスト。 • もちろんテストクラスと要求機能の実装が前後す る場合もあり。
  25. 25. 本日のまとめ • テスティングフレームワークを利用するとテスト ケースの作成も楽になり、ユニットテストを容易に できる。 • PHPUnitもごく簡単なテストケースならすぐに作 成できる。 • ただし、実際に活用するなら開発の前に仕様をで きるだけ明確化しておくことが望ましい。 • そうすれば最初から多くのテストケースを準備す る事ができる → テスト駆動開発へ。
  26. 26. 今後の課題 • PHPUnitの機能自体まだ一部しか使っていない のでさらに活用できるようにする。 • 他のテスティングフレームワークも試してみる (DocTestは特に)。
  27. 27. 参考資料 • 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
  28. 28. ご清聴、ありがとうございました!

×