地獄の炎上PHPプロジェクトから生まれた:単一ファイルで使えるユニットテストフレームワーク

はじめに

PHPのレガシーな炎上プロジェクトに立ち向かう中で、私はまず「テストを書くこと」から始めようとしました。 しかし、そこには想像以上のハードルが待っていました。composerも導入されておらず、PHPUnitを導入するのにも一苦労。 ようやく phpunit.phar を持ち込んでテストを始められる環境を整えましたが、 「この最初の一歩」に驚くほど時間を浪費してしまったのです。

もしこの“最初の一歩”を一瞬で踏み出せる方法があれば、どれほど現場のストレスを減らせるだろう? そう考えて作ったのが、single-file-unit-test です。

何が目的か?

このプロジェクトの目的は明確です。

  • テストを書き始めるまでの手間を極限まで減らす
  • どんなレガシーな炎上案件でも「テストファースト」を可能にする
  • 最終的にはPHPUnitにスムーズに移行できるようにしておく

そのために、以下の設計方針を採用しました:

  • 単一ファイル(single-file-unit-test.php)を require するだけで使える
  • PHP 5.6以上に対応(PHP 8.4でも動作確認済み)
  • assertSameexpectExceptionMessage に限定したPHPUnit互換API
  • 終了コードによりテストの成功/失敗をCIに通知可能
  • ディレクトリやファイルを引数に渡すだけで *Test.php を自動実行
  • 環境変数 NO_COLOR を指定することで、色付き出力を無効化できる柔軟性

テストの書き方

PHPUnitと同じように書けます。

<?php
require_once 'single-file-unit-test.php';

use Smeghead\SingleFileUnitTest\TestCase;
class SomeTest extends TestCase
{
    public function testAdd() {
        $sut = new Some();
        $this->assertSame(3, $sut->add(1, 2));
    }

    public function testError() {
        $this->expectExceptionMessage("Error occurred");
        (new Some())->error();
    }
}

 

CLIからの実行

php single-file-unit-test.php tests/

 

複数のディレクトリやファイルも渡せます:

php single-file-unit-test.php src/tests/ legacy/tests/SomeTest.php

色付き出力が不要なとき(ログ出力やCIなど):

NO_COLOR=1 php single-file-unit-test.php tests/

GitHub

現在 GitHub で公開しています:

おわりに

プロジェクト名にある通り、このテストフレームワークは単一ファイルで完結することに全振りしています。

「今すぐこのファイルを require して、テストを書こう」。 そう言えることで、炎上プロジェクトの現場に少しでも希望をもたらせるのではと考えています。

今後も改善していきますので、フィードバックやPRも歓迎です!

2件のコメント

  • single-file-unit-test、まさに現場で求められていたツールですね。レガシーなPHPプロジェクトでcomposerすら入っていない環境にPHPUnitを導入する苦労は本当に共感します。requireするだけで使えて、しかもPHP 5.6から8.4まで対応しているのは素晴らしいです。assertSameとexpectExceptionMessageに絞ってPHPUnit互換にしている設計判断も、後の移行を見据えていて理にかなっていると感じました。さっそく手元の古い案件で試してみたいと思います。

  • 興味深い記事ですね。レガシープロジェクトでテストを導入する際の初期設定の負担を減らすというアプローチは本当に実用的です。単一ファイルで動作するテストフレームワークという考え方は、環境構築に時間をかけられない現場では特に価値があります。PHPUnitへのスムーズな移行も考慮されているのが良いですね。私たちも同様に、複雑な設定なしに即座に使えるaffirmation image makerのようなツールの重要性を理解しています。シンプルさと実用性の両立は、開発効率を大きく向上させます。

13件のピンバック

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください