第6回 UnitTestをする理由 - テスト講座

PHP講座 HTML×CSS 初級編

TOM先生のテスト講座

Lecutures on PHP

第6回 UnitTestをする理由 (その2)

 このエントリーをはてなブックマークに追加

PHPでUnitTestをするには?

TOM先生PHPでUnitTestをするために利用できる代表的なツールを4つ紹介したいと思います。


PHPUnit

Sebastian Bergmann氏が開発を行っているテスティングフレームワークで、Sebastian氏のサイト(http://www.phpunit.de/)で配布されています。2008年8月12日現在での最新のバージョンはPHP5専用です。

PHPUnitはその時々の最新の動向に敏感に反応していて、JavaやRuby界隈で最近注目されているBDD(Behaviour-Driven Development:振舞駆動開発)的な手法などがかなり早い段階で取り込まれます。

例として会員番号を指定すると会員の情報を返してくれる会員クラスに対するテストを書いてみると次のようになります。

コード1 PHPUnitのテストコード例
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Member.php';
 
class MemberTest extends PHPUnit_Framework_TestCase
{
    private $member = null;
 
    public function setup()
    {
        $this->member = new Member();
    }
 
    public function test存在しない会員番号で検索したらnull()
    {
        $actual = $this->member->find(99999);
        $expected = null;
        $this->assertEquals($expected, $actual);
    }
}

テストコードの作り方としては、PHPUnitのクラスを継承したテストクラスを作成して、その中でtestで始まるメソッドを準備すればそれをPHPUnitが実行してくれるという流れになります。setupというメソッドを準備しておくとtestで始まるメソッドの前にそれを実行してくれます。

TOM先生

【コラム】 日本語の関数名?

テスト用の関数名が日本語になっていてびっくりされた方が多いかもしれませんね。何のテストが実行されているのか?ということをわかりやすくするためにテストの関数名を日本語にするというのはいいやり方だと思っています。苦労して英語でわかりにくいテスト名を考えるより日本語で書いてしまった方がいいと思いませんか?




実行結果1 PHPUnitの実行結果
$ phpunit MemberTest.php
PHPUnit 3.2.21 by Sebastian Bergmann.
 
.
 
Time: 0 seconds
 
 
OK (1 test)

SimpleTest

http://simpletest.sourceforge.net/で配布されているテスティングフレームワークです。2008年8月12日現在ではPHP4でも動作しますが、次のstable releaseからはPHP5専用になるようです。CakePHPやEthnaなどのフレームワークのUnitTestで利用されています。

PHPUnitと同じ例をSimpleTestで記述すると次のようになります。

コード2 SimpleTestのテストコード例
<?php
require_once 'simpletest/unit_tester.php';
require_once 'simpletest/reporter.php';
require_once 'Member.php';
 
class MemberTest extends UnitTestCase
{
    private $member = null;
 
    public function setup()
    {
        $this->member = new Member();
    }
 
    public function test存在しない会員番号で検索したらnull()
    {
        $actual = $this->member->find(99999);
        $expected = null;
        $this->assertEqual($actual, $expected);
    }
}
 
$t = new MemberTest;
$t->run(new TextReporter);

基本的なテストコードの作り方はPHPUnitと同じで、SimpleTestのクラスを継承したテストクラスを作成して、その中でtestで始まるメソッドを準備すればそれをSimpleTestが実行してくれるという流れになります。

実行結果2 SimpleTestの実行結果
$ php MemberTest.php
MemberTest
OK
Test cases run: 11, Passes: 1, Failures: 0, Exceptions: 0
 

lime

Symfonyに同梱されているテスティングフレームワークです。PHPUnitやSimpleTestがxUnit系と呼ばれるものに分類されるのと違って、より単純なテストを前提としたものとなっています。lime自体が1つのファイルのみで使用できるので手軽にUnitTestをしたいという場合には導入しやすいかもしれません。

PHPUnitと同じ例をlimeで記述すると次のようになります。

コード3 limeのテストコード例
<?php
require_once 'lime.php';
require_once 'Member.php';
 
$t = new lime_test(null, new lime_output_color);
$t->diag('Test for Member');
 
$member = new Member();
$actual = $member->find(99999);
$expected = null;
$t->is($actual, $expected, '存在しない会員番号で検索したらnull');

limeはPHPUnit/SimpleTestとはテストの作り方が大きく変わります。lime_testクラスのインスタンスを生成して、そのメソッド(上記の例ではisメソッド)を直接実行しながらテストを行います。

実行結果3 limeの実行結果
$ php MemberTest.php
# Test for Member
ok 1 - 存在しない会員番号で検索したらnull
1..1
 Looks like everything went fine.


Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)