KAROUSHI -Japanese Engineer Blog-

コボルドからドラゴンへ -Kobold to Dragon-

システムエンジニアのブログです。サイト名は「雑魚キャラからボスキャラへレベルアップしたい!」という思いを込めて命名しました。自分はやっとリザードマンになったくらいです。

Netbeans+PHPUnit+Mockeryで単体テスト環境を構築

NetbeansPHPUnit+Mockeryを入れて単体テストを動作させる記事がなかったのでメモ程度で作成。

目次

事前環境

  • Netbeansを入れておく
  • Xampp(PHP 7)を入れておく
  • composerを入れておく

composerでPHPUnit+Mockeryをインストール

適当なプロジェクトで右クリック→[composer]→[初期化]を実行すると、composer.jsonが作成される。
その後、プロジェクトで右クリック→[composer]→[依存性の追加]を押すと、パッケージのウィンドウが表示される。
トークン」欄に"phpunit"と入力してEnterを押すとパッケージ検索が開始されます。
しばらく待つと検索結果に"phpunit/phpunit"が出てくるので選択すると、今度はバージョン検索が走ります。
使用可能なバージョンから"7.1.5"を選択し[必須(dev)]を押してインストールを開始してください。
同様の手順で"mockery/mockery"の"1.1.0"をインストールします。

netbeansphpunitの設定

プロジェクトを右クリック→[構成を設定]→[カスタマイズ]を選択します。
プロジェクトプロパティ画面が開き、左メニュの[テスト]を選択し[フォルダの追加]を押し、新規フォルダ"tests"を作成して[開く]で追加します。
同画面の下部にある"テスト・プロバイダ"より"PHPUnit"を選択して[OK]を押します。

サンプルソース単体テストを用意する。

TemperatureとTemperatureTestを作成します。
TemperatureTestはテストフォルダに作成してください。
ちなみに本ソースは以下公式サイトを日本語化したサイトのものを引用しています。
Mockery 0.8.0 日本語ドキュメント

Temperatureのソース

<?php
class Temperature
{ 
    public function __construct($service)
    {
        $this->_service = $service;
    }
 
    public function average()
    {
        $total = 0;
        for ($i=0;$i<3;$i++) {
            $total += $this->_service->readTemp();
        }
        return $total/3;
    }
}

TemperatureTestのソース

<?php
require_once "../Temperature.php";
require __DIR__ . '/../vendor/autoload.php';
use \Mockery as m;

class TemperatureTest extends PHPUnit_Framework_TestCase
{
    public function tearDown()
    {
        m::close();
    }
 
    public function testAverage()
    {
        $service = m::mock('service');
        $service->shouldReceive('readTemp')->times(3)->andReturn(10, 12, 14);
        $temperature = new Temperature($service);
        $this->assertEquals(12, $temperature->average());
    } 
}

今回少しハマったのがrequireの部分。公式サイトではこの2行がなくてコピーしただけでは"PHP fatal error"が出力され動きませんでした。
公式サイトを読み進めていくと、実は以下に書いてあります。

Composerをご利用でしたら、Composerが生成したオートローダーファイルをシンプルにincludeするだけですみます。
require __DIR__ . '/../vendor/autoload.php'; // vendorディレクトリがひとつ上の階層であると仮定

初めて動かすときはコピペでやる人が多いと思うのでサンプルソースにはrequireも書いてほしいですね。
↑のrequireとテスト対象のソースをrequireすれば単体テスト動きました。