🐧

Laravel6 で、テスト周りに行われた(行われなかった)変更点を今更ながら振り返ってみる

2021/06/23に公開

Laravel6で、テスト周りで変更された箇所があります。それについて、今更ながら少し振り返ってみました。

変更の提案をしたのは、Dries Vintsさん(Laravelの2番目の社員)。

参考:GitHub [6.x] Implement integration test and in-memory DB #5169
参考:GitHub:Update unit test stub

提案内容は以下の通り。

  1. SQLiteのインメモリDBをデフォルトの設定にしようとした。
  2. tests フォルダに Feature / Unit のみならず、Integration 用のディレクトリを作ろうとした。
  3. Unit 側に作成されるテストは、(Laravel のTests\TestCaseを継承するのではなく)PHPUnit の TestCase を直接継承させようとした。

上記3点ですね。

で、最初の SQLite のインメモリについては、好意的な意見が多かったため、そのままテスト時のデフォルトのDBとして、phpunit.xml に設定されました。(但し、その約6か月後には、コメントアウトした形の記載に変化)

(2)については、様々な意見があったようで、3つもフォルダがあると、逆に混乱するのでは無いか?という話で落ち着き、Integration フォルダが追加されることはありませんでした。

(3)については、Dries さんの意見が通ったようで、コマンド使って Unit テストを作ると、基本 PHPUnit の TestCase を継承するようになりました。

Dries さん的にはそうする事で、Unit テストは、Laravelの世界を構築しない(=フレームワークを読み込まない)から、速くなっていい、とスピードメリットを述べています。

ザッとですが、以上になります。

せっかくなので、スピードテストをしてみる

Feature と Unit で、$this->assertTrue(true); だけするメソッドを各10本(メソッド)用意し、スピードテストを行ってみました。
(当方の開発マシンは、AMD Ryzen 7 3700X という奴で、そこそこ速かったりはします)

下記みたいのが10メソッドです。

    public function test_unit1()
    {
        $this->assertTrue(true);
    }

結果は、10本のテストを走らすのに掛かった時間で、10回行ったものの平均値です。

(結果)
Feature側:0.291秒
Unit側:0.234秒

という感じになりました。まぁ、一応速いですね。
(Laravelはインストールしたての状態ですので、アプリを組んでいけば、もう少し差は出るかとは思います)

後は(本当は)、DB(MySQL や SQLite のインメモリ)を使った時の比較も行いたいのですが、疲れてきたので今日はこの辺までとしておきます。

本当にテストが多くて時間が掛かる時は、並列(パラレル)で実行するといいかも知れませんね。

参考:日本語ドキュメント、テストを並列で実行

おかしな箇所等ありましたらコメント下さい。

Discussion