読者です 読者をやめる 読者になる 読者になる

PhpStorm 7 で SSH 経由で PHPUnit を実行する

PHP PHPUnit PhpStorm

下記の記事によると PhpStorm 8 では SSH 経由で PHPUnit が実行できるようです。

ホストが Windows で開発環境の VMLinux(CentOS) なわたしは PhpStorm から PHPUnit が実行できるようにするためだけに Windows でも Linux でも動作するコードを書くように心がけているのですが(主に int のサイズ)、PhpStorm 8 がリリースされればそのような苦行とはさよならできそうです、やったね。

.

.

.

それはそれとして、思いつきで PhpStorm 7 でも SSH 経由で PHPUnit が実行できるようにしてみました。例外処理とかしていないやっつけですが PHPUnit を実行するだけなのでまぁいいかなと。

前提

  • ローカルホストは Windows
  • リモートホストLinux
    • php にはパスが通っている
  • PhpStorm で Deployment の設定ができている
    • あるいはローカルとリモートでディレクトリが共有されている
  • PhpStorm で ローカルホストで PHPUnit が実行できるように設定済
    • composer で phpunit をインストール
    • [PHP -> PHPUnit] で必要な設定を行う
  • [PHP -> Servers]マッピングの設定名はリモートホストのホスト名の最初のセグメントと一致する
    • abc.example.net なら abc という設定名にする

方法

PhpStorm の メインメニューから [Run -> Edit Configurations] を選択します。

[PHPUnit] の下にある設定をすべて削除します。

img:PHPUnit の下にある設定をすべて削除

[Defaults -> PHPUnit] を選択して次のように設定します。

img:Defaults -> PHPUnit を選択

  • Interpreter options: -d include_path=. -d auto_prepend_file=remote.php
  • Custom working directory: プロジェクトのルートディレクトリ

要するに PhpStorm で PHPUnit を実行するときに auto_prepend_fileremote.php が実行されれば OK です。

remote.php を次の内容で作成します。先頭の3つの変数は適当に書き換えてください。あるいは同じディレクトリに remote.local.php を作って、そのファイルに3つの変数を書くのでも OK です。

  • $remote_hostリモートホストの IP アドレスやホスト名
  • $remote_dirリモートホストのデプロイ先ディレクトリ
  • $local_dir はローカルの PhpStorm のプロジェクトのディレクトリ

PhpStorm で PHPUnit を実行します(PHPUnit on Server じゃなくてただの PHPUnit)。PHPUnitSSH 経由で実行され、PhpStorm や Run や Debug のコンソールに結果が表示されます。

次のような Windows では通らないテストも・・・

グリーンです。

img:グリーンです

テストがコケたときのスタックトレースも、それっぽく書き換えているので PhpStorm でクリックすることができます。

img:スタックトレースもクリックできる

リモートデバッグをしたいときは [Start Listen for PHP Debug Connections] を On にしてデバッグ実行してください。

img:Start Listen for PHP Debug

[PHP -> Servers] でパスのマッピングを行っていれば、ブレークポイントを仕込んだところで止まります。

img:ブレークポイント


PhpStorm から PHPUnitデバッグ実行したとき、本当なら XDEBUG_CONFIG で idekey が渡されるのですが、その idekey で xdebug.remote のセッションを開始してもパスのマッピングが解決できない(PhpStorm は xdebug からローカルのパスで通知されると思っている)ため、PHPUnitデバッグセッションではなく PHP Remote Debug のデバッグセッションとしてアタッチする必要があります。