やみとものプログラミング日記 やみとものプログラミング日記
TOP テスト駆動開発でルーターを作る Part1
テスト駆動開発でルーターを作る Part1

テスト駆動開発でルーターを作る Part1

プログラミング
作成日時: 2020年7月8日
更新日時: 2020年7月8日
こんにちは、やみともです。
今日はテスト駆動開発でルーターを作っていこうと思います。

ルーターとは

ここで言うルーターとはハードウェア機器のルーターのことではありません。
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です。
テスト駆動開発では、まずテストを失敗させるところから始めるらしいです。
なのでこれで良いのです。

次回からは、この最初のテストを通すところから一気に実装していきます。