PHP入門:PHPUnitでechoやprintなどの出力をテストする

スポンサーリンク
PHP入門:PHPUnitでechoやprintなどの出力をテストする ノウハウ
PHP入門:PHPUnitでechoやprintなどの出力をテストする
この記事は約6分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、PHPUnitでechoやprintなどの出力をテストするテストケースについてご紹介します。

スポンサーリンク

前提

この記事は下記の記事をベースにしています。

背景

単体テストにおいて、あるメソッドを実行したときに、期待する出力が (echo や print などで) 生成されることを保証したいこともあるでしょう。PHPUnit では、PHP の Output Buffering 機能を使用してこのような機能を提供しているので、実際にテストケースを作成したいと思います。

修正内容

下記のファイルを更新、もしくは、作成します。下記の各セクションに各ファイルの修正内容を記載しています。

        new file:   19_learn_phpunit/tests/OutputTest.php

tests/OutputTest.php

下記の内容で新規作成します。

<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class OutputTest extends TestCase
{
    public function testExpectFooActualFoo(): void
    {
        $this->expectOutputString('foo');

        print 'foo';
    }

    public function testExpectBarActualBaz(): void
    {
        $this->expectOutputString('bar');

        print 'baz';
    }
}

動作確認

下記のコマンドを実施します。

docker compose run -it --rm php-cmd ./vendor/bin/phpunit tests/OutputTest.php

下記の結果になれば成功です。

% docker compose run -it --rm php-cmd ./vendor/bin/phpunit tests/OutputTest.php
[+] Building 0.0s (0/0)                                                                                                                            
[+] Building 0.0s (0/0)                                                                                                                            
PHPUnit 10.2.6 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.1.12-1ubuntu4.2

.F                                                                  2 / 2 (100%)

Time: 00:00.083, Memory: 8.00 MB

There was 1 failure:

1) OutputTest::testExpectBarActualBaz
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'bar'
+'baz'

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

解説

tests/OutputTest.php

このコードは、PHPUnitというPHP用のテストフレームワークを使用してテストを行うためのコードです。テストは、指定された条件に基づいてコードの振る舞いを確認し、問題がある場合にはエラーやバグを見つけるのに役立ちます。

ここでは、以下のクラス OutputTest が定義されています。

  1. declare(strict_types=1);: この宣言は、厳密な型チェックを有効にするためのものです。すべての関数の引数と戻り値の型が明確に指定されていることを確認します。
  2. use PHPUnit\Framework\TestCase;: PHPUnitの TestCase クラスを使用するために、PHPUnit\Framework\TestCase をインポートしています。TestCase クラスは、テストケースを定義するために継承する基底クラスです。

次に、OutputTest クラスが定義されています。このクラスは、テストケースを含むクラスとして機能します。

テストケースでは、test で始まるメソッドを作成します。ここでは、2つのテストメソッドが定義されています。

  1. public function testExpectFooActualFoo(): void: このテストメソッドでは、expectOutputString メソッドを使用して、print 'foo'; というコードの出力が ‘foo’ と一致することを確認しています。
  2. public function testExpectBarActualBaz(): void: このテストメソッドでは、同様に expectOutputString メソッドを使用して、print 'baz'; というコードの出力が ‘bar’ と一致することを確認しようとしています。しかし、このテストは失敗することに注意してください。なぜならば、expectOutputString が失敗することを期待している出力 ‘bar’ と、実際の出力 ‘baz’ が一致しないためです。

expectOutputString メソッドは、テスト中にコードが出力する内容をキャプチャして、指定した文字列と一致するかどうかをテストします。このようにして、テスト結果を自動的に確認できます。

最後に、TestCase クラスを継承するため、OutputTest クラスのテストメソッドはPHPUnitによって自動的に検出・実行されます。そして、テスト結果はテストが成功したかどうかを示します。

このコードの実行では、1つのテストが成功し、もう1つのテストが失敗します。

おわりに

今日は、PHPUnitでechoやprintなどの出力をテストするテストケースについてご紹介しました。

本記事でご紹介したソースは、下記のリポジトリにあります。

https://github.com/Gate-Yossi/Ran/releases/tag/v2023.08.09
よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

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