LoginSignup
67
64

More than 5 years have passed since last update.

PHPStorm10 + VagrantでPHPUnitテスト自動化の環境をつくる

Last updated at Posted at 2016-05-12

PHPStorm上でPHPUnitを実施するメリットとは?

PHPで開発した関数やクラスを単体テストするためのフレームワークとして「PHPUnit」があります。
PHPUnitは、一度テストのクラスを作成しておけば、あとはテストを自動化して繰り返し実行できるようになるので、人力で動作検証するよりも実装ミスやエラーの発見がしやすくなります。

単体テストフレームワークの選択肢として、以前はSimpleTestが主流でしたがバージョンアップが遅かったり、実行速度も遅かったりして、PHPUnitへの乗り換えが進んでいます。

PHPUnitはテストフレームワークの中では導入コストが低いので、PHPアプリのテスト自動化を検討している人はまずはPHPUnitの導入をおすすめします。

そして、PHPStorm + Vagrant環境で開発している人は、わざわざVagrantゲストマシンにログインせずともPHPUnitをリモート実行することができるので、単体テストをさらに効率化できます。ぜひ、環境を作っておきましょう。

skitch.png
PHPStorm上で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 を開きます。

スクリーンショット 2016-03-20 13.35.10.png

それぞれの項目を入力します。

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 を選択します。

スクリーンショット 2016-03-20 13.47.26.png

そうするとVagrantコンソールが開いてvagrant up が実行されます。

スクリーンショット 2016-03-20 13.49.27.png

vagrant upが完了したのが確認できたら、VagrantゲストマシンにSSH接続をします。

メニュー > Tools > Start SSH session... を選択します。

スクリーンショット 2016-03-20 13.46.51.png

SSH接続できた場合はターミナルが表示されます。

スクリーンショット 2016-03-20 13.53.22.png

以上で、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です。

skitch.png

PHPStorm上でPHPUnitの環境設定をする

PHPStormからVagrantゲストマシンのPHPUnitをリモート実行できるように設定していきます。

Vagrantゲストマシン上のPHPを実行可能にする

PHPStormの環境設定 > Languages & Frameworks > PHP を開きます。

PHPの環境設定画面を開いたら、まずは「Interpreter:」の横の設定ボタン[・・・]をクリックします。

skitch.png

Interpreters画面を開いたら、左ペインから ”Remote PHP 7” を選択します。

skitch.png

右ペインの「Remote」にて、”Vagrant”にチェックを入れて、「Vagrant Instance Folder:」は、Vagrantのインスタンスフォルダのパスを指定します。
(ドキュメントルートのパスではないのでご注意ください)

「General」のところには自動的に値がセットされるので特に編集しません。

以上、編集が終わったら [OK]ボタンをクリックします。

Interpreters画面を閉じてPHPの環境設定画面に戻ってきたら、カレントプロジェクトのPHPバージョンを設定します。

skitch.png

「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)”が登録されていますが、そこはとくに触りません。

Screen Shot 2018-09-07 at 19.09.46.png

プラスボタン[+]をクリックして「PHPUnit By Remote Interpreter」を選択します。
Screen Shot 2018-09-07 at 19.12.34.png

Interpreterから、該当する Remote PHP 7 を選択して[OK]ボタンをクリックします。

Screen_Shot_2018-09-07_at_19_13_37.png

右ペインに、新しいPHPUnitプロジェクト ”Remote PHP 7” が追加されます。

Screen_Shot_2018-09-07_at_19_18_17.png

それぞれの項目を編集していきます。

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 をクリックします。

skitch.png

プラスアイコン[+]をクリックして、新規コンフィギュレーションを作成します。

skitch.png

「Add New Configuration」ダイアログから「PHPUnit」をクリックします。

skitch.png

それではコンフィギュレーションを編集していきます。

Screen Shot 2018-09-07 at 19.32.07.png

「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... をクリックします。

skitch.png

Runダイアログから、先ほど作ったコンフィギュレーションをクリックします。

skitch.png

PHPUnitのユニットテストが実施されます。

skitch.png

実施結果は画面下に表示されます。

以上、これで全ての手順は完了です。

67
64
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
64