こんにちは。よっしーです(^^)
今日は、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
が定義されています。
declare(strict_types=1);
: この宣言は、厳密な型チェックを有効にするためのものです。すべての関数の引数と戻り値の型が明確に指定されていることを確認します。use PHPUnit\Framework\TestCase;
: PHPUnitのTestCase
クラスを使用するために、PHPUnit\Framework\TestCase
をインポートしています。TestCase
クラスは、テストケースを定義するために継承する基底クラスです。
次に、OutputTest
クラスが定義されています。このクラスは、テストケースを含むクラスとして機能します。
テストケースでは、test
で始まるメソッドを作成します。ここでは、2つのテストメソッドが定義されています。
public function testExpectFooActualFoo(): void
: このテストメソッドでは、expectOutputString
メソッドを使用して、print 'foo';
というコードの出力が ‘foo’ と一致することを確認しています。public function testExpectBarActualBaz(): void
: このテストメソッドでは、同様にexpectOutputString
メソッドを使用して、print 'baz';
というコードの出力が ‘bar’ と一致することを確認しようとしています。しかし、このテストは失敗することに注意してください。なぜならば、expectOutputString
が失敗することを期待している出力 ‘bar’ と、実際の出力 ‘baz’ が一致しないためです。
expectOutputString
メソッドは、テスト中にコードが出力する内容をキャプチャして、指定した文字列と一致するかどうかをテストします。このようにして、テスト結果を自動的に確認できます。
最後に、TestCase
クラスを継承するため、OutputTest
クラスのテストメソッドはPHPUnitによって自動的に検出・実行されます。そして、テスト結果はテストが成功したかどうかを示します。
このコードの実行では、1つのテストが成功し、もう1つのテストが失敗します。
おわりに
今日は、PHPUnitでechoやprintなどの出力をテストするテストケースについてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント