Laravel6 で、テスト周りに行われた(行われなかった)変更点を今更ながら振り返ってみる
Laravel6で、テスト周りで変更された箇所があります。それについて、今更ながら少し振り返ってみました。
変更の提案をしたのは、Dries Vintsさん(Laravelの2番目の社員)。
参考:GitHub [6.x] Implement integration test and in-memory DB #5169
参考:GitHub:Update unit test stub
提案内容は以下の通り。
- SQLiteのインメモリDBをデフォルトの設定にしようとした。
- tests フォルダに Feature / Unit のみならず、Integration 用のディレクトリを作ろうとした。
- 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