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

はじめに
PHPのレガシーな炎上プロジェクトに立ち向かう中で、私はまず「テストを書くこと」から始めようとしました。
しかし、そこには想像以上のハードルが待っていました。composerも導入されておらず、PHPUnitを導入するのにも一苦労。
ようやく phpunit.phar
を持ち込んでテストを始められる環境を整えましたが、
「この最初の一歩」に驚くほど時間を浪費してしまったのです。
もしこの“最初の一歩”を一瞬で踏み出せる方法があれば、どれほど現場のストレスを減らせるだろう?
そう考えて作ったのが、single-file-unit-test
です。
何が目的か?
このプロジェクトの目的は明確です。
- テストを書き始めるまでの手間を極限まで減らす
- どんなレガシーな炎上案件でも「テストファースト」を可能にする
- 最終的にはPHPUnitにスムーズに移行できるようにしておく
そのために、以下の設計方針を採用しました:
- 単一ファイル(
single-file-unit-test.php
)をrequire
するだけで使える - PHP 5.6以上に対応(PHP 8.4でも動作確認済み)
assertSame
とexpectExceptionMessage
に限定した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 で公開しています:
- https://github.com/smeghead/single-file-unit-test
- 初期バージョン:v0.0.0
おわりに
プロジェクト名にある通り、このテストフレームワークは単一ファイルで完結することに全振りしています。
「今すぐこのファイルを require
して、テストを書こう」。
そう言えることで、炎上プロジェクトの現場に少しでも希望をもたらせるのではと考えています。
今後も改善していきますので、フィードバックやPRも歓迎です!