SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Zend Framework入門

テスト記述の詳細 - Zend_Testのメソッド -

Zend Frameworkによる実践的なPHPアプリケーション開発 35

リクエストに関するテスト

 Zend Frameworkを利用する上で任意のアクション、コントローラを使用しているかを把握することは大切であり、それらを確認するために以下のメソッドが用意されています。

リクエストテストメソッド
メソッド名 引数 説明
assertModule $module 使用されたモジュールが$moduleであるかどうかを検証
assertController $controller ディスパッチされたアクションコントローラが$controllerであるかどうかを検証
assertAction $action 使用されたアクションが$actionであるかどうかを検証
assertRoute $route $routeがルータでマッチしたかどうかを検証

 IndexControllerTest.phpにこれらを使用したテストを記述していきます。「http://localhost/index/index」にアクセスされることを確認するテストです。

リスト5 テストの記述3(IndexControllerTest.php)
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
...
    public function testRequest() {
        $this->dispatch('/');
        $this->assertController('index');//   (1)
        $this->assertAction('index');//       (2)
        $this->assertModule('default');//     (3)
        $this->assertRoute('default');//      (4)
    }
}

 まずメソッドの1行目でルートをディスパッチしています。このようにコントローラ、アクションを省略して記述したときはそれぞれ「index」が使用されます。そのため(1)で「IndexController」が使用されていることを確認できます。同じように(2)では「indexAction」が使用されていることを確認できます。「$this->dispatch('index/login');」のようにディスパッチすると「loginAction」が使用されるのでテストに通らなくなります。(3)(4)は何も設定していないため'default'のままであることが確認できます。

リダイレクトに関するテスト

 Zend_Testには任意のリダイレクトが正しく行われているかを確認する以下のメソッドが用意されています。

リダイレクトテストメソッド
メソッド名 引数 説明
assertRedirect - リダイレクトが行われるかどうかを検証
assertRedirectTo $url リダイレクトが行われ、リダイレクト先が$urlとマッチするかどうかを検証
assertRedirectRegex $pattern リダイレクトが行われ、リダイレクト先が正規表現$patternにマッチするかどうかを検証

 リダイレクトが行われていることを仮定したテストを記述していきます。「http://google.com/」にリダイレクトされることを複数のテストから確認したいと思います。

リスト6 テストの記述4(IndexControllerTest.php)
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
...
    public function testRedirect() {
        $this->dispatch('index/redirect');
        
        $this->assertRedirect();//                        (1)
        $this->assertRedirectTo('http://google.com/');//  (2)
        $this->assertRedirectRegex('{.+\.com\/}');//      (3)
    }
}

 (1)はリダイレクトが行われているかの確認です。(2)はさらにリダイレクト先が「http://google.com/」であるか確認しています。(3)は上記で紹介した正規表現で指定しています。それでは実際に「http://google.com/」にリダイレクトするアクションを作成してみましょう。

リスト7 コントローラーの記述1(IndexController.php)
<?php

class IndexController extends Zend_Controller_Action
{
...
    public function redirectAction() {
        $this->_redirect('http://google.com/');
    }
}

 「http://localhost/index/redirect」にアクセスすると「http://google.com/」にリダイレクトされます。(1)~(3)のすべての条件を満たすようになりました。このようにリダイレクトが行われているかどうか、そしてそのリダイレクト先を確認することができます。

ヘッダに関するテスト

 ヘッダにはWebページの情報を示す重要なデータが含まれているため、正しい情報を含んでいるかを確認することはとても有効なことです。以下はヘッダの内容を確認するためのメソッドです。

ヘッダテストメソッド
メソッド名 引数 説明
assertResponseCode $code HTTPステータスコードが$codeと一致しているかどうかを検証
assertHeader $header $headerで指定されたヘッダがあるかどうかを検証
assertHeaderContains $header, $match $headerで指定されたヘッダが$matchにマッチしているかどうかを検証
assertHeaderRegex $header, $pattern $headerで指定されたヘッダが正規表現$patternにマッチするかどうかを検証

 HTTPステータスコードとは、100番台は「information」、200番台は「Sucsess」、300番台は「Redirect」、400番台は「Client Error」、500番台は「Server Error」というようにHTTPプロトコルで通信しているときの状態を番号で表しています。

 上記のメソッドを使用しヘッダの内容を確認するテストを記述していきます。

リスト8 テストの記述5(IndexControllerTest.php)
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
...
    public function testHeader() {
        $this->dispatch('index/header');
        
        $this->assertResponseCode(301);//     (1)
        $this->assertHeader('location');//    (2)
    }
}

 (1)はHTTPステータスコードが301かどうかを確認し、(2)ヘッダに「location」要素が含まれいるかを確認しています。デフォルトではHTTPコードが200になっていて、ヘッダに「location」要素も含んでいません。これらのテストに通るようにヘッダを書き換えた「headerAction」を作成します。

リスト9 コントローラーの記述2(IndexController.php)
<?php

class IndexController extends Zend_Controller_Action
{
...
    public function headerAction() {
        $res = $this->getResponse();
        $res->setHttpResponseCode(301);//                     (1)
        $res->setHeader('location', 'http://google.com/');//  (2)
    }
}

 「http://localhost/index/header」にアクセスすると「http://google.com/」にリダイレクトされます。

 上記のリダイレクトメソッドを使用したときと動作は同じですが今回はヘッダを変更することで実現しています。

 (1)でHTTPステータスコードをデフォルトで設定されている200から恒久的移動をあらわす301に変更しています。さらに(2)でヘッダに「location」要素を追加し、内容を「http://google.com/」にすることでリスト7と同じようにリダイレクトしています。これによってテストの内容を満たすことができています。

おわりに

 今回は、テスト記述、それに対応するアプリケーション記述を通して、テストにどのような条件を記述できるかについて紹介してきました。出力内容からヘッダの内容まで、Webアプリケーションをテストするための基本的なメソッドが揃っていることが確認できたと思います。

 次回はデータベースをテストする方法について解説する予定です。データベースのテストは、データベースのセットアップや内容の確認など、面倒な点がありますが、Zend_Test_PHPUnit_Dbクラスを利用することで、テストの記述を容易にすることができます。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

WINGSプロジェクト 郷原 啓生、風田 伸之(ゴウハラ ヒロキ、カゼタ ノブユキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5851 2011/04/08 14:00

イベント

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

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

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

メールバックナンバー