レッスンケース 2 - PHPテストケースの書き方
投稿日:2015年10月28日
カテゴリ: レッスン
, レッスンケース
フミリアです。
前回の「レッスンケース 1 - Laravelの開発についてどのように学べばよいですか?(マネージャー編)」に続き、フミリア・ラボのレッスン風景をお伝えします。
経歴も長いバックエンドエンジニアのOさんは、関わっているシステムの信頼性を上げるために、PHPの自動テストについてしっかり学びたいと思い、フミリア・ラボのレッスンを受けることを決めました。 五反田のカフェでの対面レッスン60分を選ばれました。(実際は、30分延長の合計90分のレッスンでした)
玉蘭苑の海鮮刀削麺。具たくさんの野菜・海鮮を包み込む塩味のスープがうまいです。 スープが絡まった縮れ太麺を頬張ればお腹もしっかり満たされます。
バックエンドエンジニアの技術スタックを増やす
Oさんは現在、企業の社内システムのモバイルデバイス拡張のプロジェクトに携わっています。 彼がプロジェクトに関わった時には自動テストが一切なく、そろそろなんとかしたいと思っており、早急に自動テストの技術を獲得したいとのことでした。ちなみに、社内システム拡張部分はLaravel 4で書かれているそうです。
プログラムの信頼性を担保する方法の一つとして、「自動テスト」があります。「このプログラムはこう動くはずだ」ということ操作手順やテストコード(テストのためのプログラム)として記述し、繰り返しテストを実施できるように準備します。自動テストの「自動」とは、ボタン一発で指定のテストを実行できる状態のことです。「手動テスト」というのもあります。Webブラウザで人間がマウスやキーボードを使って操作することを指します。
自動テストが行える3つの領域
一般的に、画面に表示されるUIが関係すると自動テストを整えるのは労力がかかります。サーバーサイドのプログラムはテストコードとして書きやすいので、自動テストすることを前提に用意することができます。
テストの分類にはいろいろな切り口が存在しますが、自動テストが行える領域を次の3つにまとめてみました。
- 単体テスト / ユニットテスト (Unit Test)
- 結合テスト / インテグレーションテスト (Integration Test)
- 機能テスト / ファンクショナルテスト (Functional Test)
「単体テスト」は、モジュール(プログラム部品)単体をテストすることです。PHPの世界では、クラスや関数の集合をモジュールと捉えます。「結合テスト」は、複数のモジュールが組み合わさった複雑なロジックをテストすることです。「機能テスト」は、ユースケース(システムの利用シナリオ)をテストするもので、Webアプリケーションの場合はHTTPリクエストとレスポンスを確認するテストコードを記述できます。Webブラウザを使った自動テストを行う「Selenium」という技術もあります。
PHPUnitを使った自動テスト
PHPで作られたサーバーサイドのプログラムをテストするには、ユニットテストツールの老舗的存在のJUnitのPHP版である「PHPUnit」が使えます。JUnitはたくさんのプログラミング言語に移植されており、テストコード記述に共通の概念が利用できます。PHPUnitでは、テストケース(=TestCaseクラス)、テスト項目(=TestCaseメソッド)、検証項目(assertXxx
メソッドファミリー)といったツールを使いテストコードを記述していきます。プログラムの一部をテスト専用のものに差し替える「モック」も使えます。
テストの網羅率(カバレッジ)を上げることを考えるならば、ソースファイル1つにつきテストケースクラスも1つの指針で作成していくと漏れがありません。
どのようにテストを記述するかを考える時に意識してほしいことは、テストの3つの領域それぞれで検証する視点が異なるため、準備するテストデータやモックが変わってくる点です。中〜大規模のプログラムをテストする際はテストコードを作成する時間だけでなく、テストの設計をする時間も考慮してください。
Laravelベースアプリケーションでのテストの書き方
今回のレッスンでは、Laravelベースのアプリケーションでテストを用意したいとのことでしたので、Laravelについても少し触れました。PHPUnitのテストケースクラスはPHPUnit_Framework_TestCase
クラスを継承して作りますが、LaravelではIlluminate\Foundation\Testing\TestCase
クラスを継承します。LaravelのTestCaseクラスには、HTTPリクエストを使ったテストを支援するメソッドがあります。これを使うと機能テストを簡単に記述できます。また、artisanコマンド make:test
を使ってテストケースクラスを生成することもできます。
フミリアが書いているオープンソースのライブラリにもテストケースがついていますので参考にしてください。
※この記事が参考になったと思ったら ★Star を押してくださいね!
自動テストが必要になる時
プログラム開発のライフサイクルの中で自動テストが必要になる時はいつでしょうか?
それはプログラムを開発する体制・目的によリます。 次のケースでは自動テストの用意が必要となってきます。
- オープンソースとして公開し、全世界の人に使ってもらいたい
- クローズドソースだが、複数人が同じソースコードを触る状況がある
一方、次のような状況では自動テストは作成しないでください。
- ソフトウェア設計が固まったおらず、試行錯誤している段階にある
- プロトタイプとして開発している
テストコードはソフトウェアの堅牢性を上げる反面、ソースコードの気軽な変更を妨げます。また、自分一人しか触らないプライベートなプログラムの場合も特に必要ありません。
フミリア・ラボは、プロのバックエンドエンジニアを育成します
バックエンドエンジニアは、自分の技術スタックに「自動テスト」を入れることを検討してください。 フミリア・ラボは、プロを目指すエンジニア、一歩上を目指すWebデザイナーのためのプライベート・コーチです。 自分一人で学ぶより、圧倒的に時間効率がよいですよ。
技術相談・レクチャーのご依頼は、お問い合わせフォームから送信ください。