こんにちは、プロダクト開発グループの城山です。主にFANSHIPプロダクトのバックエンドを担当しています。
今回はそんなFANSHIPプロダクトで最近リリースされたアプリ内メッセージ機能についてテスト駆動開発(TDD)を行ったので、その感想などを述べたいと思います。
テスト駆動開発とは
プログラム開発手法のことで、プログラムに必要な各機能について、最初にテストを書き、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルのこと。
一般的にテスト駆動開発の利点として多々あるが、主なメリットとして以下の点が挙げられる。
- モジュールやユニットレベルでテストと実装・リファクタリングを繰り返すため、開発の初期段階で不具合を検知又は修正できるようになり、後工程での手戻りの発生を減らせる
- 必要なシステム要件を細分化してリストアップするため、システムの要件をより深く理解できる
複数人で取り組んだテスト駆動開発について
FANSHIPプロダクトのアプリ内メッセージ機能についてはいくつかのモジュール(メッセージ作成機能、メッセージ取得機能など)によって成り立っている。 今回はそれらモジュールに対し複数人(3人)でテスト駆動開発を行うことにした。
まず初めにコード設計をし、設計者以外の全員でその設計をレビューする。 コード設計は以下の点を実際にコードに落とし込んだものとし、その落とし込んだものをレビューする形とした。
- フレームワーク
- リポジトリ構成
- クラス、メソッド、関数
- 設計の意図を伝えるためだけのものを作成
- 具体的な処理はかかない
その後、レビュー済みのコード設計に対してテストコードを作成し、作成者以外でそのテストコードをレビューする。 テストコード作成では、今回の「アプリ内メッセージ機能」が満たすべき要件を洗い出し、その洗い出した要件一つ一つに対して コード設計に沿うようにテストケースを作成した。
最後に作成したテストコードがすべてパスするようにプロダクトコードを実装し、作成者以外でレビューをし完了となる。
また今回複数人で行うテスト駆動開発の特徴としては以下の点が挙げられる。
- 1つのモジュールに対して、3人全員が何かしらの工程に関わる
- 1つのモジュールに対するテストコード作成とプロダクトコード実装作業を同じ人が担当しない
実際に行ってみて
良かった点
- システムの理解度の均一化
- 1つのモジュールを全員で取り組むことで、いわゆるシステムの属人化を早い段階で排除できる
- 不具合検知の効率化
- 1つのモジュール作成の工程に対し複数人が対応することで、それぞれの視点でシステムを評価することができ、開発段階での不具合検知の確率があがる
- コードの統一化
- コード設計を全員でチェックし統一化することで、担当を入れ替えながら進めても実装の仕方が大きくブレない
改善の余地が見られる点
- 開発スピード
- コード設計、テストコード作成、プロダクトコード実装の一つ一つでレビューを挟むため開発スピードはおちる
- 基本的に全員がすべてのモジュールのシステム構成を把握する必要があり、そのキャッチアップに時間がかかる
まとめ
今回はチャレンジという形で複数人で工程を分担しテスト駆動開発をおこなってみたのだが、それぞれのタスクを監視し合うという部分についての重要さを知れたいい機会だった。 ただ今回のような1から作る新規機能に関してはやりやすく様々な利点があったが、既存システムの改修などになるとまた話は別になってくるかもしれない。