CodeIgniterでFeatureテストを書く方法完全ガイド!自動テストの基本
生徒
「ホームページの機能がちゃんと動いているか自動で確認する、機能テストというものについて知りたいです。コードイグナイターというシステムではどのように書くのですか?」
先生
「コードイグナイターでは、フィーチャーテストという仕組みを使って、実際の画面の動きを自動で検査することができます。」
生徒
「パソコンの操作も不慣れなのですが、初心者でもテストコードを書くことはできますか?」
先生
「大丈夫です。仕組みをひとつずつ整理しながら、具体的な記述方法を学んでいきましょう!」
1. 自動テストとFeatureテストの基本
ウェブアプリケーションの開発において、作ったプログラムが正しく動くかを検証する作業はとても重要です。手作業で画面をクリックして確認する方法もありますが、プログラムを修正するたびに何度も同じ操作をするのは大変です。そこで登場するのが、コンピューターに検証を身代わりさせる自動テストという仕組みです。
コードイグナイターにおける自動テストには、いくつかの種類があります。その中でも、特定の機能全体をまとめて検査する手法をFeatureテストと呼びます。これは日本語で機能テストとも表現され、ブラウザから特定のページにアクセスしたときの一連の挙動を模倣して検証するものです。
例えば、お問い合わせページにアクセスして、文字を入力し、送信ボタンを押したときに、正しく完了画面が表示されるかといった一連の流れをプログラムで再現します。これにより、開発者はボタンひとつでいつでもシステム全体の健康状態を確かめることができるようになります。
2. テスト環境の準備とPHPUnitの役割
自動テストを実行するためには、専用の道具が必要です。コードイグナイターでは、世界中で広く使われているPHPUnitというテスト用の枠組みを利用します。これは、プログラムが想定通りの結果を返しているかを判定するためのソフトウェアです。
パソコンを触ったことがない方に向けて説明すると、これは料理を作るときに味見を自動で行ってくれる判定マシーンのようなものです。あらかじめ期待する味の基準を設定しておくと、完成した料理がその基準に達しているかを一瞬で教えてくれます。
テストを実行する際は、パソコンの命令画面である端末、またはコマンドプロンプトと呼ばれる黒い画面に、特定の命令を入力します。開発環境の設定ファイルがあらかじめ準備されていれば、簡単なコマンドを入力するだけで、すべての検証プログラムが順番に実行され、結果が画面に出力されます。
3. 初めてのFeatureテストコードを作成する手順
それでは、実際に動く簡単なテスト用のプログラムを記述してみましょう。コードイグナイターで機能テストを作成するときは、専用のファイルを作成し、そこに検証内容を記述していきます。ファイルは決められた場所に保存する必要があり、通常はテスト用のフォルダ内に配置します。
ファイルを作成する際は、名前の最後に必ず「Test」という文字をつけるルールがあります。これにより、システムがそのファイルを検証用プログラムとして認識します。まずは、特定のページにアクセスしたときに、無事にページが開くことができるかを確認する最も単純なコードを書いてみましょう。
namespace Tests\Feature;
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Test\CIUnitTestCase;
class HomePageTest extends CIUnitTestCase
{
use FeatureTestTrait;
public function testHomeResponseView()
{
$result = $this->get('/');
$result->assertStatus(200);
}
}
このプログラムは、もっとも基礎的な構造を示しています。最初の行にある記述は、ファイルの位置情報や、コードイグナイターが提供するテスト用の便利な機能を取り込むための宣言です。関数の中に書かれている処理が、実際の検証内容となります。
4. ページアクセスとステータスコードの検証
先ほどのプログラムの中にある具体的な命令の意味を解説します。まず、指定の文字にアクセスする命令があります。これは、インターネットブラウザのURL入力欄にアドレスを打ち込んで、ページを開く操作と同じことをプログラムの内部で行っています。
そして、その結果を受け取ったあとに、状態が正常であるかを判定しています。ここで使われている数字は、インターネットの世界における共通の信号であり、ステータスコードと呼ばれます。数字の「200」は、通信が成功し、ページが正常に表示されたことを意味する記号です。
もし、ページが存在しない場合は「404」という数字になり、システムにエラーが発生している場合は「500」という数字になります。検証プログラムでは、この数字が確実に「200」であることを確認することで、画面が壊れていないかを判断しています。この判定を行う命令のことをアサーションと呼びます。
5. 画面に表示される文字の内容を検査する方法
ページが正常に開くだけでなく、画面の中に正しい文字が表示されているかどうかを確認することも重要です。例えば、ログイン画面を開いたのに、全く関係のない文字が表示されていたら不具合となります。コードイグナイターでは、画面内のテキストを探索する命令も用意されています。
次のプログラムは、トップページにアクセスした際に、画面の中に特定の歓迎メッセージが含まれているかどうかを検証する例です。これにより、デザインや文字が正しく出力されているかを自動的にチェックできます。
namespace Tests\Feature;
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Test\CIUnitTestCase;
class WelcomeTextTest extends CIUnitTestCase
{
use FeatureTestTrait;
public function testWelcomeMessageExists()
{
$response = $this->get('/');
$response->assertSee('ようこそ');
}
}
ここで新しく使われている命令は、指定した文字列が画面のデータの中に含まれているかを調べる機能を持っています。もし、画面の中に該当する文字が見つからない場合は、検証が失敗したとみなされ、エラーメッセージが表示されます。これにより、文字の消え去りや表示ミスを即座に発見できます。
6. フォーム送信とデータのやり取りを検証する
ウェブサイトでは、文字を入力してボタンを押すという操作が頻繁に行われます。例えば、会員登録やお問い合わせのフォームがこれに該当します。機能テストでは、このようなユーザーの入力操作をプログラムで再現し、送信後の挙動を検証することができます。
次の例では、お名前の入力欄に文字を入れて送信し、その結果として次の画面に正しく遷移するかどうか、また、送信されたデータが受け付けられているかを模倣して確認する処理を記述しています。
namespace Tests\Feature;
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Test\CIUnitTestCase;
class ContactFormTest extends CIUnitTestCase
{
use FeatureTestTrait;
public function testSubmitContactForm()
{
$formData = [
'username' => 'たろう',
'email' => 'test@example.com'
];
$response = $this->post('/contact/submit', $formData);
$response->assertStatus(200);
}
}
このプログラムでは、送信したいデータをひとまとめにして、指定のアドレスに対して情報を送信する命令を出しています。これにより、実際のブラウザでボタンをクリックしたときと同じ状態を作り出し、プログラムの内部処理が安全に実行されるかを確認することができます。
7. テストを実行した結果の読み方
記述したテストプログラムを実行すると、パソコンの画面に結果が文字で表示されます。最初は見慣れない英語の羅列に見えるかもしれませんが、結果のパターンは非常にシンプルです。成功したか失敗したかを見極めるポイントを押さえましょう。
すべての検証が思い通りに成功した場合、画面には緑色の背景で合格を意味する文字が表示されます。一方、プログラムに問題があり、期待通りの結果にならなかった場合は、赤色の背景で不合格の通知が表示されます。実際の出力結果のイメージは以下のようになります。
PHPUnit 9.5.0 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 00:00.123, Memory: 10.00 MB
OK (3 tests, 3 assertions)
画面に「OK」と表示されていれば、すべてのテストが正常に通過したことを意味します。もし「FAILURES」という文字が表示された場合は、どの場所で不具合が起きたのか、行番号とともに詳細な原因が親切に表示されるため、それを手掛かりにプログラムを修正していきます。
8. 自動テストを習慣化することのメリット
プログラミングをはじめばかりのときは、テストコードを書く作業は手間に感じるかもしれません。しかし、自動テストを書き溜めておくことには、数多くの大きな利点があります。最大の本質は、過去に作った機能を壊してしまう恐怖から解放される点にあります。
プログラムが大きくなっていくと、ある場所を直した影響で、別の場所が動かなくなってしまうという現象がよく起こります。手作業の検証だけでは見落としが発生しますが、自動テストがあれば、いつでも数秒で全体の動作確認が終わります。これにより、安心して新しい機能を追加したり、古いコードをきれいに書き換えたりすることができるようになります。開発全体の効率を劇的に向上させるためにも、初期の段階からこの手法に触れておくことが推奨されます。