Laravelで単体テスト: カバレッジ計測

Laravel
この記事は約5分で読めます。
スポンサーリンク

Laravel9の新機能であるテストカバレッジ計測を試してみました。
テストカバレッジとは、ソフトウェアテストの進捗を表す尺度の一つです。テスト対象のコードのうち、どの程度の割合のコードがテストされたかを表すものです。

スポンサーリンク

環境

カバレッジ計測を行った環境です。

ソフトウェアバージョン
PHP8.2.6
Laravel10.13.5
スポンサーリンク

カバレッジ計測

テスト対象(TodoController)

Todoのステータス文字列を返す関数をテストします。
戻り値が3パターンあります。

<?php

namespace App\Http\Controllers;

use App\Models\Todo;
use Illuminate\Http\Request;

class TodoController extends Controller
{
    public function getStatus(Request $request)
    {
        $todo = Todo::find($request['id']);

        if($todo)
        {
            switch($todo->isComplete)
            {
                case 0:
                    return ['status' => 'unfinished'];
                case 1:
                    return ['status' => 'finished'];
            }
        }
        else
        {
            return ['status' => 'none'];       
        }
    }
}

テストコード

テストコードを作成します。
戻り値が3パターンあるので、3つのAssertを書きます。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_getStatus(): void
    {
        $response = $this->get(route('todo.status', ['id' => 1]));
        $response->assertExactJson(['status' => 'unfinished']);

        $response = $this->get(route('todo.status', ['id' => 2]));
        $response->assertExactJson(['status' => 'finished']);

        $response = $this->get(route('todo.status', ['id' => -1]));
        $response->assertExactJson(['status' => 'none']);
    }
}

テストコマンド

testコマンドにオプション「--coverage」をつけて実行します。

php artisan test --coverage

ERROR Code coverage driver not available. Did you install Xdebug or PCOV?
が出た場合、PCOV(CodeCoverage compatible driver for PHP)をインストールしてください。

sudo pecl install pcov

インストール後、php.iniに「extension=pcov.so」を追加してください。
※php.iniの場所は、「php --ini」で確認できます。

peclコマンドが見つからない場合、以下のコマンドを実行してください。

sudo apt-get install php-dev php-pear

実行結果

coverageオプションをつけてtestコマンドを実行すると、カバレッジ計測結果が出力されます。
「Http/Controllers/TodoController」に関して、カバレッジ100%のテストコードを書いたので、カバレッジが「100.0%」となっています。

テストコードのAssertを1つ目のみにして、testコマンドを実行すると、TodoControllerのカバレッジが「62.5%」になりました。
カバレッジだけでなく、TodoControllerのどの行がテストされてないかも教えてくれます。
今回の場合、「21, 22..27」がテストされていないコードだと分かります。


Laravel10でテストカバレッジ計測を試しました。
テストカバレッジ計測は、Laravel9以降で利用可能です。

テスト駆動で開発する際、カバレッジ計測をすると良さそうです!

タイトルとURLをコピーしました