🙄

assertEqualsを今すぐ捨て、assertSameを使うのです

2022/03/15に公開

PHPUnitの基本


以下の記事のタイトル「PHPの改善 !== PHPのバージョンアップ」を見てふと思った。

https://developers.prtimes.jp/2022/03/10/a_nice_php_is_not_equal_as_a_new_php/

ちなみに上記記事とは一切関係ない話。
あと、内容には全然共感しなかった。

PHPUnitを使っていると必ず出てくるassertEquals
各種サンプルにもでてくるし定番だとお思ってる方がほとんどだと思うが、
筆者は一切使わない(特殊な場合は除くかもだが)

問題点を指摘する前に仕様を確認してみると

assertEquals

assertEquals(mixed $expected, mixed $actual[, string $message = ''])
2 つの変数 $expected と $actual が等しくない場合にエラー $message を報告します。
assertNotEquals() はこのアサーションの逆で、同じ引数をとります。

assertSame

assertSame(mixed $expected, mixed $actual[, string $message = ''])
2 つの変数 $expected と $actual が同じ型・同じ値でない場合にエラー $message を報告します。
assertNotSame() はこのアサーションの逆で、同じ引数をとります。

('_') おわかりいただけただろうか

assertEqualsは 型チェック をしないのだ
気づいたときは名前から想像できなかったわ。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

assertEquals

PHPのダメなところとして
nullとfalseと0と空文字が全部同じ扱いになるというのがある。
厳格にするためにstricttypesだの===だのやってるのに、
肝心のPHPUnitで抜けててどうするって話よ

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

final class EqualsTest extends TestCase
{
  public function testFailure(): void
  {
    $this->assertEquals(0, false);
  }
}

0とfalseがイコールなわけ

composer exec phpunit -- tests/badTest.php 
PHPUnit 9.5.18 #StandWithUkraine
.                                                                   1 / 1 (100%)
Time: 00:00.006, Memory: 4.00 MB
OK (1 test, 1 assertion)

(´・ω・`)

(´・ω:;.:…

(´:;….::;.:. :::;.. …..

通ってしまいましたとさ。

(・ω・) Equalじゃねー

assertSame

名前からして使えなさそうだが。。。

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

final class SameTest extends TestCase
{
  public function testFailure(): void
  {
      $this->assertSame(0, false);
  }
}
composer exec phpunit -- tests/goodTest.php 

PHPUnit 9.5.18 #StandWithUkraine
F                                                                   1 / 1 (100%)
Time: 00:00.006, Memory: 4.00 MB

There was 1 failure:

1) Test\goodTest::testFailure
Failed asserting that false is identical to 0.
/home/dozo/build/tests/goodTest.php:11

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Script phpunit handling the __exec_command event returned with error code 1

(^_^)b 検出した!

------------------- ↓ 後書きはここから ↓-------------------

名称はもうちょっとどうにかして欲しい感じはあるけど、
原則assertSameを使えというのは理解してもらえたかと思う。

Discussion