PHPUnitを利用してユニットテストを行うサンプルコード

PHPUnitを利用してユニットテストを行うサンプルコード

テストフレームワークであるPHPUnitを利用して、ユニットテストを自動化する簡単なサンプルとなります。

環境

  • OS  CentOS 8.0.1905 (Core)
  • php 7.3
  • composer 1.9.1
  • phpunit 8.5.1

※phpunitのインストール手順はこちら

開発用ディレクトリ作成

適当な名前で開発用のディレクトリを作成します

mkdir testdir
cd testdir

テストの対象となるsrcディレクトリとテスト用のtestディレクトリも作成します。

mkdir src
mkdir test

次にcomposer.jsonを下記の通りに作成します。

vi composer.json
{
    "require-dev": {
        "phpunit/phpunit": "^8.5"
    },
    "autoload": {
        "psr-4": {
            "Sample\\": "src/"
        }
    }
}

composer dumpautoloadを実行します。

composer dumpautoload

次にsrcディレクトリ内に下記のコードの通りに、Sample.phpを作成します。

<?php 
namespace Sample;
 
class Sample {
    // $a + $b の足し算の結果を返す
    public function Add($a, $b) {
        return $a + $b;
    }    
}

testディレクトリ配下に、下記のコードで、SampleTest.phpという名前で作成します。

<?php 
require_once('vendor/autoload.php');
 
//クラスの後ろにTestをつける
class SampleTest extends PHPUnit\Framework\TestCase {

    //test_から始まるメソッドがテストケースとして扱われる
    public function test_add() {

        $sample = new Sample\Sample();    

        // 1+2 の期待される結果は3だがとなっているためエラーが発生
        $this->assertEquals(1, $sample->Add(1, 2));
        // 2+2 の期待される結果を第一引数に記述
        $this->assertEquals(4, $sample->Add(2, 2));        
        //足し算でも掛け算でも同じ4なためテストケースを追加
        $this->assertEquals(5, $sample->Add(2, 3));
    }
}

ディレクトリ構成は下記の通りとなります。

.
├── composer.json
├── src
│   └── Sample.php
├── test
│   └── SampleTest.php
└── vendor
    ├── autoload.php
    └── composer
        ├── ClassLoader.php
        ├── LICENSE
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        ├── autoload_real.php
        └── autoload_static.php

準備ができたので、テストを実行してみます。

## わかりやすいように色をつけて実行
phpunit --color test

現状のSampleTest.phpだと

// 1+2 の期待される結果は3だがとなっているためエラーが発生
$this->assertEquals(1, $sample->Add(1, 2));

でエラーが発生するため、下記のメッセージが表示されます

PHPUnit 8.5.1 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 21 ms, Memory: 4.00 MB

There was 1 failure:

1) SampleTest::test_add
Failed asserting that 3 matches expected 1.

/home/testuser/testdir/test/SampleTest.php:13

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

SampleTest.phpの期待する結果が間違っているので、下記の通りに修正します。

<?php 
require_once('vendor/autoload.php');
 
//クラスの後ろにTestをつける
class SampleTest extends PHPUnit\Framework\TestCase {

    //test_から始まるメソッドがテストケースとして扱われる
    public function test_add() {

        $sample = new Sample\Sample();    

        // 1+2 の期待される結果は3だがとなっているためエラーが発生
        $this->assertEquals(3, $sample->Add(1, 2));
        // 2+2 の期待される結果を第一引数に記述
        $this->assertEquals(4, $sample->Add(2, 2));        
        //足し算でも掛け算でも同じ4なためテストケースを追加
        $this->assertEquals(5, $sample->Add(2, 3));
    }
}

もう一度実行します。コマンドが長いので、aliasに登録して実行してみます。

## aliasに登録
alias ut="phpunit --color test"

## 実行
ut

<出力結果>
PHPUnit 8.5.1 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 20 ms, Memory: 4.00 MB

OK (1 test, 3 assertions)

今度は、問題ないので、OKと表示されるようになります。