中野's workspace

  • Profile
  • Privacy
  • Contact

2019/07/17

PHPUnitでテストコードを書いて実行するまで

  • #PHP
  • #PHPUnit
  • #UnitTest

目次

はじめに

PHPのテストツールであるPHPUnitを使ってテストコードを書いて実行するまで試します。

composerでインストールする~実際にテストを動かしてみるまでを扱います。

composer自体のインストール方法については下記を参考にしてみてください。

そもそもcomposerって何?って方は↓

PHPUnitとは

PHPのテストツールです。

システム開発において、テストは欠かせません。

変更した箇所がきちんと要件を満たしており、既存の機能に影響を与えていないかを都度都度テストする必要があります。

テストは修正の規模に関係なく、どんなに小規模の修正であっても必要です。

ただ、毎回人の手でテストするのでは骨が折れるし、ミスが発生する可能性がありますよね?

そこで単体テスト規模のテストをコードで書き、自動化するためのツールが開発されました。

そのうちの一つがPHPUnitです。

使いこなすことが出来ればプログラムの信頼性を高めることができ、変更が既存の機能に影響を与えていないと証明できるようになります。

安心して夜眠れるようになり、寝不足が解消され、結果として午前中のパフォーマンスが鰻登り!…かもしれません。

公式サイト

PHPUnitを試す

では早速PHPUnitの実行環境を整備しましょう!

今回はcomposerで導入していきます。

PHPプロジェクトの作成

まずはプロジェクトを作成します。

任意のディレクトリにて以下のコマンドを実行します。

composer init

対話シェルで質問に答えていくとcomposer.jsonが作成されます。

次にphp-unitを導入します。

開発時にしか使用しないものなのでrequire-devに入れます。

composer require --dev phpunit/phpunit

vendorディレクトリを見るとvendor\bin\phpunitが出来ているはずです。

実行ファイルとテストファイルの作成

次に実行ファイルとテストファイルを作成します。

今回のケースではディレクトリ構成を以下のようにします。

root/
 ├ src/
 │  └ Sample.php
 ├ test/
 │  └ SampleTest.php
 ├ vendor/
 └ composer.json

src配下に実装を配置し、test配下にテストファイルを配置するようにします。

phpunitではテストファイルはテストしたいファイル名Test.phpというファイル名を付けるのが一般的です。

今回はテストしたい対象がSample.phpなので、テストファイルはSampleTest.phpとしています。

composer.jsonとphpunit.xmlの編集

作成したSample.phpをuse文で使えるようにするために、composer.jsonでautoloadの設定を行います。

composer.json
"autoload": {
    "psr-4": { "App\\": "src" }
},

上記のように設定した後、composer dump-autoloadしてvendor配下にautoload.phpが出来上がればOKです。

最後にphpunit.xmlを下記のように編集しましょう。

phpunit.xml
<?xml version="1.0" encoding="UTF-8" ?>
<phpunit colors="true"
         verbose="true"
         bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Sample">
            <directory>test</directory>
        </testsuite>
    </testsuites>
</phpunit>

<directory>にはテストしたいディレクトリを設定します。

今回はtestディレクトリ配下なので<directory>test</directory>とします。

また、bootstrapに先ほど作成されたautoload.phpを指定することで、テストファイル内でuse文を使えるようになります。

ここまで出来たら環境構築は終了です。

実際にテストを書いてみましょう。

実装

Sample.phpを以下のように実装したものとします。

Sample.php
<?php
declare(strict_types=1);
namespace App;

class Sample
{
    public function hello() {
        return "Hello World";
    }
}

Sampleクラスのhelloメソッドを呼び出すと”Hello World”が返るようになっていますね。

これに対するSampleTest.phpの実装は下記のようにします。

SampleTest.php
<?php

use PHPUnit\Framework\TestCase;
use App\Sample;

class SampleTest extends TestCase
{
    public function testReturnHello()
    {
        $sample = new Sample();
        $result = $sample->hello();

        $this->assertEquals("Hello World", $result);
    }
}

解説は後述するので、何となく雰囲気でOKです。

この状態でvendor/bin/phpunitとするとテストが実行され、成功するのが確認出来ると思います。

コードの解説

先ほど書いたテストコードの解説を行います。

テストをするには対象となるクラスを呼び出せるようにする必要があるため、use文を使います。
PHPUnitでテストケースを書く殆どの場合はテストクラスがPHPUnit\Framework\TestCaseを継承している必要があるので、これも呼び出します。 extends TestCaseを忘れずに

use PHPUnit\Framework\TestCase; // これを継承する
use App\Sample; // テスト対象

class SampleTest extends TestCase

テストコードは下記のように記載します。
メソッドはpublicで、testテストしたい内容とします。
下記では、Sampleクラスのhelloメソッドを呼び出した結果を$resultに入れています。

PHPUnitでは、$this->assertEquals(期待する値, テスト対象);とすることでテストを行えます。
今回はhelloメソッドの戻り値はHello Worldであることを期待しているので、下記のように記載しています。

    public function testReturnHello()
    {
        // テスト対象の呼び出し
        $sample = new Sample();
        // メソッド実行
        $result = $sample->hello();

        $this->assertEquals("Hello World", $result);
    }

まとめ

PHPUnitはPHPの単体レベルのテストツールです。

composerでインストールし、phpunit.xmlの設定を行えばすぐに使えるようになります。

テストファイル名は「テストしたいファイル名Test.php」テストメソッドは「testテストしたい内容」とします。

テストを書き($this->assertEqualsなど)、vendor/bin/phpunitで実行します。

ガンガンテストを書いて、コードの品質を高めていきましょう!

このエントリーをはてなブックマークに追加