目次
Webアプリケーションフレームワークがサポートしているテストコードの種類を調べました
調査対象は以下の通りです。
- Go (Gin)
- Java (Spring)
- Ruby (Rails)
- PHP (Laravel)
- Python (Django)
なお、ユニットテスト(クラスやモジュール単体をテストする物)についてはいずれのフレームワークもサポートしているため省略しています
Go(Gin)のテストコードの種類
- HTTP testing
- HTTPリクエストを送信し、レスポンスを検証します
参考資料: https://github.com/gin-gonic/gin#testing
Java(Spring)のテストコードの種類
- Integration Testing
- リクエストを送信し、レスポンスを検証します
- DBと接続した状態でテストを行います
- テストの目的は「IoCコンテナが正しくセットアップされているか」「SQLが正しく記述されているか」などです
Ruby(Rails)のテストコードの種類
- Parallel Testing
- テストを並列に実行します
- Model Testing
- ActiveRecordモデルをテストします
- ActiveRecordモデルはビジネスロジックを記述するレイヤーであり、ORMでもあります
- System Testing
- ヘッドレスブラウザでアプリケーションに接続しレスポンスを検証します
- Functional Tests
- コントローラのアクションに対するテストです
- リクエストを送信し、レスポンスを検証します
- Integration Testing
- ワークフローの一連の流れをテストします(例えば、ログインして、何らかの操作を行ってログアウトする。など)
なお、いずれもDBに接続した状態でテストを行うようです。⇛詳細
参考資料: https://guides.rubyonrails.org/testing.html#parallel-testing
PHP(Laravel)のテストコードの種類
- HTTP Tests
- リクエストを送信し、レスポンスを検証します
- Console Tests
- artisanコマンドをテストします
- LaravelにはCLIツールを作成する仕組みがあり、それで作成されたものがartisanコマンドです
- Browser Tests
- ヘッドレスブラウザでアプリケーションに接続しレスポンスを検証します
DBに接続した状態でテストを行うためのユーティリティが用意されており、上記のテストと組み合わせて使用します。⇛詳細
参考資料: https://laravel.com/docs/8.x/testing
Python(Django)のテストコードの種類
Djangoのドキュメントは各テストについて、概念の名称ではなくクラス名で説明されている。
- SimpleTestCase
- リクエストを送信し、レスポンスを検証するクラスです
- DBに接続せずにテストを行います
- TransactionTestCase
- DBに接続した状態でテストを行うクラスです
- LiveServerTestCase
- ヘッドレスブラウザでアプリケーションに接続しレスポンスを検証するクラスです
- DBに接続した状態でテストを行います
参考資料: https://docs.djangoproject.com/en/3.2/topics/testing/tools/
まとめと所感
機能テストの重要性
いずれのフレームワークも機能単位のテスト(リクエストを投げて、レスポンスを検証する)が用意されている事がわかりました。
Laravelのドキュメントにも、機能テストが重要である旨の記述があります。
通常、ほとんどのテストは機能テストである必要があります。これらのタイプのテストは、システム全体が意図したとおりに機能しているという最も高い信頼性を提供します。
フレームワークを活用するのであれば、主に機能テストを書いていくのが良さそうです
DBに接続してテストを行う
多くのフレームワークで、DBに接続してテストを行うためのユーティリティが用意されていました。
- テストケース毎にDBを初期化する仕組み
- テスト用データの生成(Fixture, Seeder, Factoryなど)
- DBに関するアサーション
- レコードの存在チェックなど
Railsでは様々な粒度のテストが用意されていますが、いずれもDBに接続した状態でテストを行うスタンスの様です。
ほぼすべてのRailsアプリケーションはデータベースと頻繁に相互作用するため、テストでも相互作用するデータベースが必要になります。効率的なテストを作成するには、このデータベースを設定してサンプルデータを入力する方法を理解する必要があります。
https://guides.rubyonrails.org/testing.html#the-test-database
SQLの記述ミスなども検出できるようになりますので、可能な限り、DBと接続した状態で動作するテストコードを記述するのが良さそうです
用語の揺れ
各フレームワークで出来ることはおおよそ同じである一方で、用語が微妙に異なる点が気になりました。
例えばIntegration Testという用語について、Springでは、「リクエストを送信し、レスポンスを検証するテスト」を指すのに対し、Railsでは「ワークフローの一連の流れのテスト」を指しています。
(Railsでは「リクエストを送信し、レスポンスを検証するテスト」を「Functional Tests」と呼んでいます。)
このように、フレームワークによってニュアンスの違いがあるため、異なる文化のエンジニア同士で議論する際は、勘違いで空中戦にならないように気を付ける必要がありそうです。
以上です!
Webエンジニアをやっています
UX/UIデザインからプログラミング、DB設計、SEO、インフラ構築など幅広く対応してます
PHP/PHPUnit/Laravel/Vue/Nuxt/Docker/Terraform
ご連絡はTwitterのDMまで。