地獄の炎上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 '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も歓迎です!

コメントする

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


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

This site uses Akismet to reduce spam. Learn how your comment data is processed.