PHP自動テスト環境の構築

こんにちは、mi2yo4です。
最近、あまり技術的な事を書いていないな〜、と思ったので、今日は自分が使っているPHPの自動テスト環境について書いてみようかと思います。

コードを書いたら、即座にテストコードを自動的に実行し結果を表示してくれる…

これであれば、自分の書いた変更点が悪さをしていないか即座に分かります。プログラムコード品質の「見える化」のようなものですね。
是非とも全社的に導入すべき技術だと思っています。

し・か・し、私のテスト環境はあちこちの情報を元に試行錯誤しながら構築したものです。なので他メンバーの方に再度新しいテスト環境を構築しようとしても再現できるかどうか分からない部分もありますorz

どうしようかな〜、と思っていたところ、丁度良い資料を発見しましたので紹介します。

3分でできる俺PHPテスト環境

これを元に、今回はPHPの自動テスト環境を構築してみます。

Composerのインストール

ComposerというのはPHPのパッケージ管理ツールです。元々、先ほど挙げたPEARがデフォルトで入っていますが、Composerの方がプロジェクト毎に依存するパッケージをインストールする事が出来ます。

メリットとしては、意図しないパッケージの環境汚染が起こらなくなる事でしょう。
AというパッケージをインストールしたPCで、「トマトプロジェクト」と「いちごプロジェクト」の両方のプロジェクトを開発している場合を考えてみます。「トマトプロジェクト」ではAパッケージを使いますが、「いちごプロジェクト」では使う予定はありません。

前述のPEARの場合、Aパッケージはどちらのプロジェクトでも使用可能です。なので、「いちごプロジェクト」でもAに依存したコードを書けてしまいます。

Composerでば、「トマトプロジェクト」の中にAパッケージをインストールさせてしまいます。「いちごプロジェクト」にはAパッケージが内包されていないので、Aパッケージに依存したコードを書くことは出来ません。

では早速インストールしてみます。Linux/OS Xの場合は下記のコマンドを、Windowsの場合はComposerのダウンロードページでバイナリをダウンロード後、インストールします。

$ curl -sS https://getcomposer.org/installer | php

ダウンロードして出来たcomposer.pharをラクに使えるようにpathの通った場所に移します。

$ sudo mv composer.phar /usr/local/bin/composer

PHPUnitのインストール

PHPUnitとは、ユニットテストのためのフレームワークです。
「本当にこのプログラムコードは意図通りに動作するの?」という事を保証するためにテストコードを書いたりしますが、PHPUnitという枠組み(フレームワーク)を使えば、テスト実行前の準備やらテスト結果の表示やらなどの雑用は全てフレームワークに任せて、プログラマはテストコードだけに集中できます。

元々、PHPUnitのインストールにはPHPに標準で添付されているパッケージマネージャ、PEAR(PHP Extension and Application Repository)を用いていましたが、2014/12/末をもってPHPUnitをPEARでインストール出来なくなりました。なので、Composerを使ってインストールします。

プロジェクトフォルダ(ディレクトリ)にcomposer.jsonの名前でファイルを作成します。内容は以下の通りです。

{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}

(PHPUnitは現在、バージョン4.4まで出ていますが、3.7.*のバージョンでないと他ソフトとの連携が取れないようです)

そして、PHPUnitをインストールします。

$ composer init

プロジェクトディレクトリ以下に「vender」ディレクトリが出来ていることを確認します。
vendor/bin/phpunitでPHPUnitを実行出来るようになりました。

stagehand-testrunnerのインストール

PHPUnitをコマンド一発で実行出来るようになりました。ただ、今のままではテストをしたい場合、逐一phpunitコマンドをユーザーが実行しなくてはいけません。ぶっちゃけそんなの面倒くさいです。ソースコード・テストコードが変更されたら、自動的に変更を検知して「全てのテスト」を実行して欲しいですね。

stagehand-testrunnerでそれが可能なので、インストールしてみましょう。

composer.jsonを以下のように変更します。

{
    "require-dev": {
        "phpunit/phpunit": "3.7.*",
        "piece/stagehand-testrunner": "~4.1@dev"
    }
}

一度composerを起動した事があるのならば、updateコマンドでインストールできます。

$ composer update

vendor/bin/以下にtestrunnerコマンドが入っているのを確認して下さい。

stagehand-testrunner実行

ターミナル(linux/OS X)、もしくはコマンドプロンプトを立ち上げ、以下のコマンドを入力します。

$ vendor/bin/testrunner compile

ここまで来ればあと一息。
プロジェクトディレクトリ以下に、testというディレクトリでテストコードを管理していれば、以下のコマンドで実行します。

vendor/bin/testrunner phpunit -a ./test

これでstagehand-testrunnerは実行中となり、コードの変更を自動的に検知して全てのテストを実行するようになります。
自分の書いた変更点が他に悪影響を及ぼしていないか一発で分かるようになりますね!

参考資料

stagehand-testrunnerについてはGithubに書いてあるものが最新だと思うので、他の所はあまり参考にしなくていいかもしれません(私は当初それを知らずハマった覚えがあります)
ComposerについてはCodezineの記事が参考になると思います。