テスト駆動開発でルーターを作る Part1
作成日時: | 2020年7月8日 |
更新日時: | 2020年7月8日 |
こんにちは、やみともです。
今日はテスト駆動開発でルーターを作っていこうと思います。
Webアプリケーションにおいて、アクセスされたURLを解析し適切なプログラム(コントローラー)を呼び出すプログラムのことです。
また、この処理をルーティングと言い、Ruby on Railsではroutes.rbファイルにルーティングの設定を書きます。
では、今日はこのルーターをテスト駆動開発で作ってみましょう。
ちなみにプログラミング言語はPHPで説明します。
まずはPHPUnitをcomposerでインストールするのですが、composerのインストール方法は「composer インストール windows10」や「composer インストール mac」とググって調べてください。
composerはインストール済みと仮定し、PHPUnitのインストールから解説します。
まずはこのディレクトリを作成しcomposerでPHPUnitをインストールしましょう。
yamitomo_router(dir) -> Router.php(file)
yamitomo_router(dir) -> tests(dir) -> RouterTest.php(file)
yamitomo_routerディレクトリ直下で
[ RouterTest.php ]
早速実行してみましょう。
テスト駆動開発では、まずテストを失敗させるところから始めるらしいです。
なのでこれで良いのです。
次回からは、この最初のテストを通すところから一気に実装していきます。
今日はテスト駆動開発でルーターを作っていこうと思います。
ルーターとは
ここで言うルーターとはハードウェア機器のルーターのことではありません。Webアプリケーションにおいて、アクセスされたURLを解析し適切なプログラム(コントローラー)を呼び出すプログラムのことです。
また、この処理をルーティングと言い、Ruby on Railsではroutes.rbファイルにルーティングの設定を書きます。
では、今日はこのルーターをテスト駆動開発で作ってみましょう。
ちなみにプログラミング言語はPHPで説明します。
実装の準備
テスティングフレームワークにはPHPUnitを使用します。まずはPHPUnitをcomposerでインストールするのですが、composerのインストール方法は「composer インストール windows10」や「composer インストール mac」とググって調べてください。
composerはインストール済みと仮定し、PHPUnitのインストールから解説します。
PHPUnitのインストール方法
好きな名前のディレクトリで作業して良いのですが、この記事ではyamitomo_routerというディレクトリ以下で開発することにします。まずはこのディレクトリを作成しcomposerでPHPUnitをインストールしましょう。
mkdir yamitomo_router cd yamitomo_router composer require --dev phpunit/phpunitこれでPHPUnitが使えるようになりました。
ディレクトリの準備
次に以下のような構成になるようにディレクトリとファイルを準備します。yamitomo_router(dir) -> Router.php(file)
yamitomo_router(dir) -> tests(dir) -> RouterTest.php(file)
yamitomo_routerディレクトリ直下で
touch Router.php mkdir tests cd tests touch RouterTest.php
今回作るルーターの簡単な仕様
とりあえずの仕様ですが、次のような感じで使えるように作っていこうと思います。require_once "yamitomo_router/Router.php";
// ルーティング設定
Router::get("/", "Index");
Router::get("article/[int id]", "Article");
// ルーティング
list($controller_class_name, $params) = Router::routing($_SERVER["REQUEST_METHOD"], $_SERVER["REQUEST_URI"]);
// コントローラーの処理呼び出し
$controller_class_name::process($params);
実装
最初のテストメソッドを実装します。[ RouterTest.php ]
<?php
use PHPUnit\Framework\TestCase;
require_once "Router.php";
class RouterTest extends TestCase
{
public function test_routing_index()
{
Router::get("/", "Index");
$controller_class_name = Router::routing("get", "/");
$this->assertEquals("Index", $controller_class_name);
}
}
テストの実行
テストコマンドを毎回打つのがめんどくさいので、次のコマンドを実行するか、~/.bashrcか~/.bash_profileに次のコマンドを書いておくかすると良いでしょう。alias p="vendor/bin/phpunit --color tests/"これでyamitomo_routerディレクトリ直下でpコマンドでテストが実行できます。
早速実行してみましょう。
$ p PHPUnit 9.2.5 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 00:00.023, Memory: 4.00 MB There was 1 error: 1) RouterTest::test_routing_index Error: Class 'Router' not found /Users/yuki/testblog/yamitomo_router/tests/RouterTest.php:11 ERRORS! Tests: 1, Assertions: 0, Errors: 1.エラーが表示されればOKです。
テスト駆動開発では、まずテストを失敗させるところから始めるらしいです。
なのでこれで良いのです。
次回からは、この最初のテストを通すところから一気に実装していきます。