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

12,711 views

Published on

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,711
On SlideShare
0
From Embeds
0
Number of Embeds
519
Actions
Shares
0
Downloads
37
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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. ご清聴、ありがとうございました!

×