SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

S2Container.PHP5を用いたDIベースの開発

S2Containerの自動バインディング機能の利用


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

UnitTestについて

 上述したようにS2Containerを用いる場合、ある機能を使いたい時はS2Containerからその機能を持つコンポーネントを取り出して使用します。UnitTestについても同様に考えます。S2Containerからある機能をもつコンポーネントを取得してテストします。

 ログインサービスのサンプルでは、「login.php」においてS2ContainerからloginServiceコンポーネントを取得しました。この時、S2Containerの自動バインディング機能によりauthLogicコンポーネントと組み合わされた形でloginServiceコンポーネントが返されていました(ConsoleLoginServiceSimplePasswdAuthLogicがDIされていた)。

 ここでは、authLogicコンポーネントのみをコンテナから取得して、認証ロジックのテストをしてみます。UnitTestフレームワークにはPHPUnit2を用います。S2Containerには、PHPUnit2_Framework_TestCaseクラスを継承し、いくつかの機能を追加したS2Container_S2PHPUnit2TestCaseが付属していますのでこれを使用することにします(PHPUnit2を別途インストールする必要があります)。

 実際のファイルは次のとおりです。

SimplePasswdAuthLogicTest.class.php
<?php
/**
 * PHPUnit2 設定
 */
require_once('test.inc.php');

/**
 * S2Container.PHP5 設定
 */
require_once('s2setup.inc.php');

/**
 *SimplePasswdAuthLogicクラスのUnitTestクラス
 */
class SimplePasswdAuthLogicTest extends S2Container_S2PHPUnit2TestCase {

    /**
     * S2Containerから自動でauthLogicコンポーネントがセットされます。
     * @var AuthLogic
     */
    public $authLogic;

    /**
     * @see PHPUnit2_Framework_TestCase::__construct()
     */
    public function __construct($name) {
        parent::__construct($name);
    }

    /**
     * テスト実行mainメソッド
     */
    public static function main(){
        $suite  = new PHPUnit2_Framework_TestSuite(__CLASS__);
        $result = PHPUnit2_TextUI_TestRunner::run($suite);
    }

    /**
     * SimplePasswdAuthLogic::auth() UnitTest
     */
    public function testAuth(){
        $this->assertTrue($this->authLogic->auth('foo','bar2006'));
        $this->assertFalse($this->authLogic->auth('foo','bar'));
    }

    /**
     * 各テストの前処理として、S2Container_S2PHPUnit2TestCase::includeDicon()
     * にてS2Containerを生成します。
     * @see PHPUnit2_Framework_TestCase::setUp()
     */
    protected function setUp(){
        print __CLASS__ . "::" . $this->getName() . PHP_EOL;
        $this->includeDicon('login.dicon');
    }

    /**
     * @see PHPUnit2_Framework_TestCase::tearDown()
     */
    protected function tearDown() {
        print PHP_EOL;
    }
}

/**
 * SimplePasswdAuthLogicTest の実行
 */
SimplePasswdAuthLogicTest::main();
?>
test.inc.php
<?php
/**
 * PHPUnit2の設定
 */
define('PHPUnit2_MAIN_METHOD', '');
require_once('PHPUnit2/Framework/TestSuite.php');
require_once('PHPUnit2/TextUI/TestRunner.php');
?>

 SimplePasswdAuthLogicTest::setUp()で、S2Container_S2PHPUnit2TestCase::includeDicon()を実行し、S2Containerを生成しています。

 SimplePasswdAuthLogicTestクラスにアクセス権がpublicなauthLogicプロパティを用意しておくと、S2Container_S2PHPUnit2TestCaseは、S2Containerからプロパティ名と同名のauthLogicコンポーネントを取得し、authLogicプロパティにセットしてくれます。

 SimplePasswdAuthLogicTest::testAuth()が実際のテストメソッドになり、ここでauthLogicプロパティにセットされているauthLogicコンポーネント(SimplePasswdAuthLogic)をテストします。それでは、SimplePasswdAuthLogicTestをコマンドラインから実行します。

SimplePasswdAuthLogicTest.class.phpの実行
C:\CodeZine>php SimplePasswdAuthLogicTest.class.php
PHPUnit 2.3.5 by Sebastian Bergmann.

SimplePasswdAuthLogicTest::testAuth

.

Time: 0.486456

OK (1 test)

C:\CodeZine>

まとめ

 ログインサービスの説明の中で、ところどころに「コンテナにDIしてもらう」、「コンテナにインジェクションしてもらう」といった表現が出てきました。S2Containerを用いたDIベースの開発では、S2ContainerによるDIを想定した設計・実装・テストを行います。ログインサービスでもS2ContainerがDIできるように、プロパティにセッターメソッドを用意したり、自動バインディング機能を用いるためにセッターメソッド引数をインターフェイスでType Hintingしています。そして、使いたい機能はS2Containerから取得して使用し、テストしたい場合も同様にS2Containerからコンポーネントを取り出してテストします。

 PHP5がリリースされてから2年ほど経ち、PHP4からPHP5に移行する機会が増えつつあると思います。もしPHP5で開発を始められることがありましたら、S2Contaienr.PHP5を導入し、DIベースの開発を始めてみてはいかがでしょうか。

参考資料

  1. Seasar入門 はじめてのDI&AOP』 須賀幸次 著、ソフトバンククリエイティブ、2006年2月
  2. SeasarファウンデーションのJavaで実装されたプロダクトの入門書です。コンテナやコンポーネント、Dependency Injectionなどの説明は、プログラム言語を問わず参考になります。
  3. Web+DB press(Vol.31)』 技術評論社、2006年2月
  4. 特集記事として「Seasar2徹底攻略」があります。Seasarファウンデーションの概要説明や、DIベースの設計について「Goyaで学ぶDIベースのシステム設計」など、本稿執筆にあたり参考にしました。
  5. Seasarファウンデーション
  6. Seasarファウンデーションには、大きく分けてJavaプロジェクト、.NETプロジェクト、PHPプロジェクトの3つがあります。PHPに関してはSeasar.PHPプロジェクト配下に、次の4つの開発プロジェクトがあります。S2Container.PHP5と併せて参照してみてください。
    • Maple.PHP
    • PHPを使ってより効率よくWebアプリケーションを作るためのフレームワーク
    • S2Container.PHP5
    • DI(Dependency Injection)とAOP(Aspect Oriented Programming)をサポートしたS2 のPHP5版コンテナ
    • S2Dao.PHP5
    • マッピング情報をXMLに記述しないO/Rマッピングフレームワーク
    • S2Base.PHP5
    • S2Container.PHP5とS2Dao.PHP5を用いた開発を支援するコマンドツール
  7. labs.s2php5.jp
  8. S2Container.PHP5、S2Dao.PHP5、S2Base.PHP5のコミッタにより作成されているホームページです。S2Container.PHP5のページにいくつかのScreencastが公開されています。本稿で説明したログインサービスに類似のものもありますので閲覧してみて下さい。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

klove(klove)

Seasarファウンデーション Seasar.PHPプロジェクトにて、コミッタ活動しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/495 2007/04/13 12:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング