1. HOME
  2. ブログ
  3. IT技術
  4. TDD入門してみた by Laravel

TDD入門してみた by Laravel

今回はTDDについて学習したので、そのまとめになります。

学習といっても、TDDという開発手法は奥が深く、またそれを使いこなすのはそれ何に難しいということで、何となくの雰囲気を掴んでやってみることを目標にしています。

すごく単純化したケースを題材にしているので、とっかかりになれば幸いです。

TDDとは

Test-Driven Developmentの略で、日本語ではテスト駆動開発という開発手法。

すごく雑に表現すると、テストを先に書き、そのテストが通るように実装し、そして内容を修正して綺麗にしていくやり方になります。

TDDの基本的な考え方

2つの原則

  1. 自動化されたテストが失敗した場合だけ、新しいコードを書く。
  2. 重複を除去する。

テストが先行するので、(初回は)落ちる前提のテストを作って、それを通る実装をするのが基本的な流れになります。

重複を削除というのは、例えばテストを通すために書いたコードで、共通化できるところは共通化していく、そんなイメージです。

また、TDDでの開発サイクルは大きく「レッド、グリーン、リファクタリング」の3つで構成されています。

レッド

動作しない、おそらく最初のうちはコンパイルも通らないテストを1つ書く

KentBeck. テスト駆動開発 (Japanese Edition) (p.6). Kindle 版.

グリーン

そのテストを迅速に動作させる。このステップでは罪を犯してもよい。

KentBeck. テスト駆動開発 (Japanese Edition) (p.6). Kindle 版.

※ここでの「罪」とは、良い設計とされる様々な原則を無視したコードを書くこと。
「普通ならそう書かないでしょ...」なコードも、このステップでは一時的に許されます。というのも、次のステップでリファクタが待っているためです。

リファクタリング

テストを通すために発生した重複をすべて除去する

KentBeck. テスト駆動開発 (Japanese Edition) (p.7). Kindle 版.

 

TDDで機能を作ってみよう

概要を抑えたので、早速TDDを意識して機能を作っていきましょう。

ゴール

今回は、メモアプリのメモ登録機能APIを実装する所に焦点を当てます。
登録に成功した場合と失敗した場合、それぞれでJSON形式のレスポンスを返します。

 

準備

作業を行うにあたり、以下を事前に準備しておく必要があります。

  1. マイグレーションファイル作成
  2. モデル作成
  3. コントローラ作成
  4. ルーティング
  5. テストクラス作成

TDDで実装してみる

TDDでは、やるべきことをToDoリストに書き出しておきます。
その各ToDoをクリアしていくことで、気づいたら機能ができていたという流れになっています。

本当はもっと細かい粒度でやった方が良いのかもですが、今回は以下をToDoとして設定します。

  1. JSONレスポンスを返す
  2. DBへの登録処理ができる

1. JSONレスポンスを返す

ここでは、postリクエストを投げたあと、コントローラが最後に返すJSONレスポンスを実装します。

1. レッド:落ちるテストを書く

このテストを実行するとこうなります。

JsonResponse型を返さないといけないのに、何も返ってないとい怒られました。
当然です。現時点ではコントローラには何も実装されていません。

1回目のレッドをここで行いました。

2. グリーン:登録成功or失敗時のレスポンスが返るように、仮実装する

1で出たエラーをもとに、コントローラを実装しましょう。
これが上で述べたグリーンの部分になります。

色々言いたくなるコードですが、気にせずテストを実行してみます。
※↓テストはここでは修正していません。

2つともテストが通りました。

3. リファクタ:FormRequestクラスにバリデーション処理の移譲

グリーンをクリアしたら次はリファクタです。
TDDにおけるリファクタは、「テストがグリーンである範囲での修正」になります。

まずフォームリクエストクラスを作成し、以下のように実装します。
※内容的に、FormRequestの単体テストでやることかもですが...

合わせてコントローラも修正します。

かなりスッキリしたと思います。

2. DBへの登録処理をテスト

同じ要領でメモの登録処理を実装していきます。

1. 落ちるテストを書く

testStoreSuccess()にて、memosテーブルに登録されているデータを検証しています。

このテストを実行すると以下になります。

保存処理を実装していないので、当然の結果になります。

2. DB登録されるように、仮実装する

テストが通るようにコントローラを修正します。

テストを実行します。

無事通りました。

リファクタですが、やるとするならモデルを外に出すとかですかね...。
ケースが単純ゆえコードもシンプルなので、今回はスキップします。

感想

今回実装したのは簡単な処理でしたが、TDDでやろうとすると結構時間が掛かりました。これはシンプルに流れに慣れていないことが主な要因だと思うので、練習しようと思います。

また、テストを意識して実装する(というか強制的にそうなる)のが面白かったです。
自分で問題作ってそれを解いている感覚になりました。

1つ気になったことは、単純な機能ならTDDでやるイメージが湧くけど、大きな機能、フロントも絡む実装になってくると大変そうだなということです。
実際にTDDでガッツリ開発しているプロジェクトのお話も聞いてみたくなりました。

テストは割りと好きなので、TDDで開発できるようになったら楽しそうだなと思いました。

書いた人はこんな人

たけちゃん(エンジニア)
たけちゃん(エンジニア)
2022年7月に入社しました。開発未経験で未知の領域だらけですが、楽しく学びつつ、早く戦力になれるようにがんばります!

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア