こんにちは。よっしーです(^^)
今日は、PHPUnitにおけるテスト失敗時の出力についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
テストが失敗した場合は、PHPUnit は問題の特定に役立つ情報をできるだけ多く提供しようとします。
今回は、その内容についてご紹介します。
修正内容
下記のファイルを更新、もしくは、作成します。下記の各セクションに各ファイルの修正内容を記載しています。
new file: 19_learn_phpunit/tests/ArrayDiffTest.php
tests/ArrayDiffTest.php
下記の内容で新規作成します。
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
final class ArrayDiffTest extends TestCase
{
public function testEquality(): void
{
$this->assertSame(
[1, 2, 3, 4, 5, 6],
[1, 2, 33, 4, 5, 6]
);
}
}
動作確認
下記のコマンドを実施します。
docker compose run -it --rm php-cmd ./vendor/bin/phpunit tests/ArrayDiffTest.php
下記の結果になれば成功です。
% docker compose run -it --rm php-cmd ./vendor/bin/phpunit tests/ArrayDiffTest.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 1 / 1 (100%)
Time: 00:00.079, Memory: 8.00 MB
There was 1 failure:
1) ArrayDiffTest::testEquality
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
Array &0 (
0 => 1
1 => 2
- 2 => 3
+ 2 => 33
3 => 4
4 => 5
5 => 6
)
/work/tests/ArrayDiffTest.php:10
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
この例では、配列の値のうち1つだけが異なっており、他の値はエラーが発生した場所のコンテキストを提供するために示されています。
解説
出力が長くなる場合
生成された出力が読むのに長い場合は、PHPUnit はそれを分割し、差分ごとに数行のコンテキストを提供します。
例えば、下記のテストコードを用意します。
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
final class LongArrayDiffTest extends TestCase
{
public function testEquality(): void
{
$this->assertSame(
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 33, 4, 5, 6]
);
}
}
上記のテストを実行すると、以下のような出力が得られます。
% docker compose run -it --rm php-cmd ./vendor/bin/phpunit tests/LongArrayDiffTest.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 1 / 1 (100%)
Time: 00:00.085, Memory: 8.00 MB
There was 1 failure:
1) LongArrayDiffTest::testEquality
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
11 => 0
12 => 1
13 => 2
- 14 => 3
+ 14 => 33
15 => 4
16 => 5
17 => 6
)
/work/tests/LongArrayDiffTest.php:10
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
エッジケース
比較に失敗した場合は、PHPUnit が入力値をテキスト化して比較します。この実装のせいで、diff を見ると実際に存在するよりも多くの問題が表示される可能性があります。
これは、assertEquals() やその他の「弱い」比較関数を配列やオブジェクトに対して使用した場合にのみ発生します。
例えば、下記のテストケースを用意します。
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
final class ArrayWeakComparisonTest extends TestCase
{
public function testEquality(): void
{
$this->assertEquals(
[1, 2, 3, 4, 5, 6],
['1', 2, 33, 4, 5, 6]
);
}
}
上記のテストを実行すると、以下のような出力が得られる。
% docker compose run -it --rm php-cmd ./vendor/bin/phpunit tests/ArrayWeakComparisonTest.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 1 / 1 (100%)
Time: 00:00.151, Memory: 8.00 MB
There was 1 failure:
1) ArrayWeakComparisonTest::testEquality
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
- 0 => 1
+ 0 => '1'
1 => 2
- 2 => 3
+ 2 => 33
3 => 4
4 => 5
5 => 6
)
/work/tests/ArrayWeakComparisonTest.php:10
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
この例では、assertEquals()が値を一致とみなしているにもかかわらず、最初のインデックスの 1と’1’の差が報告されてしまいます。
おわりに
今日は、PHPUnitにおけるテスト失敗時の出力についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント