#PHPStorm上でPHPUnitを実施するメリットとは?
PHPで開発した関数やクラスを単体テストするためのフレームワークとして「PHPUnit」があります。
PHPUnitは、一度テストのクラスを作成しておけば、あとはテストを自動化して繰り返し実行できるようになるので、人力で動作検証するよりも実装ミスやエラーの発見がしやすくなります。
単体テストフレームワークの選択肢として、以前はSimpleTestが主流でしたがバージョンアップが遅かったり、実行速度も遅かったりして、PHPUnitへの乗り換えが進んでいます。
PHPUnitはテストフレームワークの中では導入コストが低いので、PHPアプリのテスト自動化を検討している人はまずはPHPUnitの導入をおすすめします。
そして、PHPStorm + Vagrant環境で開発している人は、わざわざVagrantゲストマシンにログインせずともPHPUnitをリモート実行することができるので、単体テストをさらに効率化できます。ぜひ、環境を作っておきましょう。
##利用するPHPStormの機能
PHPStorm + Vagranatでテスト自動化を行うには、以下2つの機能を利用します。
- PHPStorm 7から導入された「Vagrant Support」
(Vagrant操作をGUIから行う機能) - PhpStorm 8から導入された「Remote PHP interpreters」
(リモートマシンのPHPアプリをSSH経由で実行する機能)
PHPStorm 10では、バージョン8の頃から設定手順が変わっているので、最新の設定手順を紹介したいと思います。
#実施環境
■ホストマシン
- Macbook Pro (Retina, 15-inch, Mid 2014)
- Mac OS X 10.11 El Capitan
- PHPStorm 10.0.4
- VirtualBox 5.0.20
- Vagrant 1.7.4
- Ruby 2.2.5p319 (2016-04-26 revision 54774)
■Vagrantゲストマシン
- CentOS 6.7 64bit
- GuestAdditions 5.0.17
- PHP 7.0.3
今回の手順では Vagrantユーザーを対象にしているため、VirtualBox + Vagrantのセットアップ手順は省略しています。
なのでもしVagrant環境がない人は、あらかじめホストマシン上に brew cask などでパッケージをインストールの上、以降の手順を進めてください。
#はじめに PHPStorm の Vagrant Support を設定する
PHPStormの環境設定から Tools > Vagrant を開きます。
それぞれの項目を入力します。
Vagrant executable:
/usr/local/bin/vagrant
instance folder:
/Users/[ユーザー名]/Documents/website_production/testsite.jp/vagrant
※自身のvagrantホームディレクトリを指定してください
Provider:
virtualbox
項目を3つとも入力したら[OK]ボタンをクリックします。
##GUIからVagrantを起動してSSH接続をする
Vagrantゲストマシンを起動するには、メニュー > Tools > Vagrant > up を選択します。
そうするとVagrantコンソールが開いてvagrant up が実行されます。
vagrant upが完了したのが確認できたら、VagrantゲストマシンにSSH接続をします。
メニュー > Tools > Start SSH session... を選択します。
SSH接続できた場合はターミナルが表示されます。
以上で、Vagrant Support機能は正しく設定できていることが確認できました。
以降は、Vagrantゲストマシンを起動したまま、PHPUnitのセットアップを進めていきます。
#Vagrantゲストマシン上でPHPUnitをセットアップする
composerを使ってPHPUnitをインストールするので、もしまだ composer の実行環境がなければ先にインストールします。
$ sudo su -
$ cd ~/
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
$ composer -v
それでは、PHPUnitをセットアップしていきます。
PHPUnitを使って自動テストをしたいPHPアプリのドキュメントルートに移動します。
##composerパッケージの定義ファイル「composer.json」を設置する
composer.jsonを作成します。
$ cd /path/to/document-root
$ vim composer.json
composer.jsonの中身は下を記述します。
{
"require-dev": {
"phpunit/phpunit": "5.3.*"
}
}
phpunitのバージョン指定を "5.3.*" としましたが、最新の安定版バージョンはPHPUnit公式サイトで確認できます。
##phpunitをインストールする
composer.jsonに記述したphpunitをインストールします。
$ composer install --dev
インストールされたphpunitは、<カレントディレクトリ>/vendor/binに配置されます。
phpunitコマンドが実行できることを確認します。
$ ./vendor/bin/phpunit --version
もし ./vendor/bin
がなければ代わりに以下のパスにインストールされています。
$ ./vendor/phpunit/phpunit/phpunit --version
##PHPUnitテスト用ディレクトリを作成する
テスト用ディレクトリを作成します。
利用しているフレームワークやCMSごとにテストディレクトリのパスが決まっていることがありますが、ここではドキュメントルート直下にtestsという名前で作成します。
$ mkdir tests
ブートストラップとなるファイルを設置します。
ちなみにブートストラップとは、テスト時に参照するフレームワークやCMSなどのAPIやクラスを読み込むためのものです。
$ vim tests/bootstrap.inc
たとえば、Drupal7用のモジュールをテストする場合、ブートストラップはこのようなコードになります。
<?php
/**
* PHPUnit custom bootstrap for Drupal7
* PHP version 7.x
*/
$_SERVER['HTTP_HOST'] = 'default';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['SERVER_SOFTWARE'] = null;
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['QUERY_STRING'] = '';
$_SERVER['PHP_SELF'] = $_SERVER['REQUEST_URI'] = '/';
$_SERVER['HTTP_USER_AGENT'] = 'console';
define('DRUPAL_ROOT', '/path/to/document-root');
require_once(DRUPAL_ROOT . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'bootstrap.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
WordPressのプラグインをテストする場合は、このようなコードになります。
<?php
/**
* PHPUnit custom bootstrap for WordPress
* PHP version 7.x
*/
global $wp, $wp_query, $wp_the_query, $wp_rewrite, $wp_did_header,$current_user;
define('WP_USE_THEMES', false);
require_once ('/path/to/document-root/wp-blog-header.php');
require_once('/path/to/document-root/wp-load.php');
wp();
require_once( ABSPATH . WPINC . '/template-loader.php' );
require_once(ABSPATH . 'wp-admin/includes/admin.php');
##PHPUnit設定ファイル「phpunit.xml」を設置する
ブートストラップの設置が終わったら、PHPUnitの設定ファイルを設置します。
設置場所は、ドキュメントルート直下に phpunit.xml というファイル名です。
$ vim phpunit.xml
phpunit.xmlの記述内容は下のとおりです。
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.3/phpunit.xsd"
bootstrap="tests/bootstrap.inc"
>
</phpunit>
bootstrap= のところには先ほど設置した tests/bootstrap.inc を指定します。
上の設定はもっとも簡潔な内容です。phpunit.xmlの詳しい書き方はPHPUnit公式マニュアルにまとまっています。
以上で、Vagrantゲストマシン上でのPHPUnitのセットアップは完了です。
ここでいったんVagrantゲストマシンをシャットダウンします。
シャットダウンは、PHPStormのメニュー > Tools > Vagrant > Halt を選択すればOKです。
#PHPStorm上でPHPUnitの環境設定をする
PHPStormからVagrantゲストマシンのPHPUnitをリモート実行できるように設定していきます。
##Vagrantゲストマシン上のPHPを実行可能にする
PHPStormの環境設定 > Languages & Frameworks > PHP を開きます。
PHPの環境設定画面を開いたら、まずは「Interpreter:」の横の設定ボタン[・・・]をクリックします。
Interpreters画面を開いたら、左ペインから ”Remote PHP 7” を選択します。
右ペインの「Remote」にて、”Vagrant”にチェックを入れて、「Vagrant Instance Folder:」は、Vagrantのインスタンスフォルダのパスを指定します。
(ドキュメントルートのパスではないのでご注意ください)
「General」のところには自動的に値がセットされるので特に編集しません。
以上、編集が終わったら [OK]ボタンをクリックします。
Interpreters画面を閉じてPHPの環境設定画面に戻ってきたら、カレントプロジェクトのPHPバージョンを設定します。
「PHP Language Level:」を設定します。
設定値は、VagrantゲストマシンのPHPと同じPHPバージョンにすればよいので、Vagrantゲストマシンの PHP 7.0.3 に合わせて 7 を指定します。
次に「Interpreter:」を指定します。
設定ボタンをクリックすると、PHPの選択画面が表示されます。
設定が終わったら、[OK]ボタンをクリックします。
##Vagrantゲストマシン上のPHPUnitを実行可能にする
PHPStormの環境設定 > Languages & Frameworks > PHP > PHPUnit を開きます。
左ペインにデフォルトで”Local(current project)”が登録されていますが、そこはとくに触りません。
プラスボタン[+]をクリックして「PHPUnit By Remote Interpreter」を選択します。
Interpreterから、該当する Remote PHP 7 を選択して[OK]ボタンをクリックします。
右ペインに、新しいPHPUnitプロジェクト ”Remote PHP 7” が追加されます。
それぞれの項目を編集していきます。
PHPUnit library
- Path to phpunit.phar: /path/to/document-root/vendor/bin/phpunit
Test Runner
- Default configuration file: /path/to/document-root/phpunit.xml
- Default bootstrap file: /path/to/document-root/tests/bootstrap.inc
編集が終わったら[OK]ボタンをクリックします。
以上により、PHPUnitをリモート実行する環境が整いました。
##PHPUnitのテストファイルを設置する
とりあえず、動作検証のために適当なテストファイルを設置します。
テストファイルは以下の内容にしました。
<?php
class ExampleTest extends PHPUnit_Framework_TestCase {
/**
* Tests something to demonstrate that PHPUnit and Drupal are loaded
*/
public function testSomething() {
// check something simple
$this->assertEquals(2, 2);
// check something that depends on Drupal's libraries
$this->assertEquals(drupal_strtolower('ASDF'), 'asdf');
}
}
PHPUnitでテストクラスを設計する場合は、基本ルールとして PHPUnit_Framework_TestCase クラスを継承します。
その中に、pubulicメソッドを作成するのですが、クラス名は test*** という風にtestから始まる名前にします。
この命名ルールで作成されたpubulicメソッドは、PHPUnitを実行したときに自動実行されます。
その中にPHPUnitで利用可能なAssertメソッドを用いてテストコードを記述してきます。
詳しい設計方法は、公式ドキュメントが参考になります。
##PHPUnitのコンフィギュレーションを設定する
PHPUnitのユニットテストで使用されるコンフィギュレーションを設定していきましょう。
PHPStormのメニュー > Run > Edit Configurations をクリックします。
プラスアイコン[+]をクリックして、新規コンフィギュレーションを作成します。
「Add New Configuration」ダイアログから「PHPUnit」をクリックします。
それではコンフィギュレーションを編集していきます。
「Name:」には、任意のテスト名を入力します。
Test Runner
「Test Scope:」は、4つのスコープから選ぶことになります。 「Directory」にチェックを入れた場合は、testsディレクトリ配下の全てのテストファイルをまとめて実行できるので、ひとまずこれを選んでおきましょう。
「Directory:」には、ホストマシン上でのtestsディレクトリパスを入力します。
Command Line
「Interpreter options:」では、phpunitコマンドのパラメーターを指定可能ですがひとまず空白のままで大丈夫です。
「Custom working directory:」は、どこのディレクトリ上でphpunitコマンドを実行するのかを指定します。
空白のままならば、testsディレクトリ上でphpunitコマンド実行することになります。
僕の場合はドキュメントルート直下でphpunitコマンドが実行されるようにしたいので、ホストマシン上でのドキュメントルートのパスを入力しました。
編集が終わったら、[OK]ボタンをクリックして設定を保存します。
あとはテストを実施するのみです。
PHPStormのメニュー > Run > Run... をクリックします。
Runダイアログから、先ほど作ったコンフィギュレーションをクリックします。
PHPUnitのユニットテストが実施されます。
実施結果は画面下に表示されます。
以上、これで全ての手順は完了です。