はじめに
テスト駆動開発(TDD: Test-Driven Development)は、「テストを先に書いてから実装する」開発手法です。コードの品質を保ちながら、安心してリファクタリングできる環境を作ります。
この連載では、PerlのモダンなオブジェクトシステムであるMooと、強力なテストフレームワークTest2を使って、TDDの基本から実践的なテクニックまでを学んでいきます。
対象読者
- Perlの基本構文を理解している方
- オブジェクト指向プログラミングに興味がある方
- テストを書いたことがない、または少ししか経験がない方
- 「テストを先に書く」という発想に興味がある方
この記事では、環境構築から最初のテストまでを一緒に体験していきましょう。
環境構築(サクッと動かす)
まずは、すぐに試せる開発環境を整えます。Dockerを使えば、ローカル環境を汚さずに始められます。
リポジトリの作成
プロジェクト用のディレクトリを作成しましょう。
|
|
Dockerfileの準備
以下の内容でDockerfileを作成します。Perl 5.38の公式イメージをベースに、必要なモジュールをインストールします。
|
|
cpanfileでの依存管理
プロジェクトで使用するモジュールをcpanfileで管理します。
|
|
Mooは軽量で高速なオブジェクトシステム、Test2::V0はモダンなテストツールキットです。
compose.yamlの作成
開発を楽にするため、compose.yamlも用意しましょう。
|
|
動作確認
環境が正しくセットアップできたか確認します。
|
|
Perlのバージョン情報が表示されれば成功です。
|
|
cpanmが正常に動作していることも確認しておきましょう。
TDDの基本サイクルを体験
TDDには「レッド→グリーン→リファクタリング」という基本サイクルがあります。
レッド:失敗するテストを書く
まず、実装がまだ存在しない状態でテストを書きます。当然、このテストは失敗します(赤=Red)。この段階で「何を作るべきか」を明確にします。
グリーン:最小限の実装で通す
次に、テストを通すための最小限のコードを書きます。テストが成功すれば緑(Green)になります。「きれいなコード」ではなく「動くコード」を最優先します。
リファクタリング:コードをきれいにする
テストが通った状態で、コードを整理します。テストがあるので、壊していないか常に確認できます。
このサイクルを小刻みに繰り返すことで、品質の高いコードを安全に作り上げていきます。
実践:Personクラスを作ってみる
それでは、実際にTDDでシンプルなPersonクラスを作ってみましょう。
プロジェクト構造の準備
まず、ディレクトリ構造を整えます。
|
|
lib/: アプリケーションコードを配置t/: テストコードを配置
ステップ1:失敗するテストを書く(レッド)
t/01-person.tを作成します。
|
|
このテストを実行してみましょう。
|
|
当然、Personクラスがまだ存在しないので、テストは失敗します。これが「レッド」の状態です。
ステップ2:最小限の実装で通す(グリーン)
lib/Person.pmを作成します。
|
|
Mooのhasキーワードでnameアトリビュートを定義しました。
is => 'ro': 読み取り専用(read-only)required => 1: 必須パラメータ
再度テストを実行します。
|
|
今度は全てのテストが通るはずです。これが「グリーン」の状態です!
ステップ3:リファクタリング
今回のコードは非常にシンプルなので、リファクタリングの必要はほとんどありません。しかし、例えばテストに説明を追加するなどの改善ができます。
|
|
subtestを使うことで、テストをグループ化して読みやすくできます。
全体のテスト実行
プロジェクト全体のテストを実行するには、以下のコマンドを使います。
|
|
-l:lib/ディレクトリをインクルードパスに追加-r:t/ディレクトリ以下を再帰的に実行
まとめと次回予告
TDDの心構え
今回、私たちは以下のサイクルを体験しました。
- レッド:まずテストを書いて失敗させる
- グリーン:最小限の実装でテストを通す
- リファクタリング:コードを改善する
TDDの本質は「テストファースト」だけではありません。小さなステップで進むことが重要です。一度に多くを実装しようとせず、1つのテストを通すことに集中しましょう。
今回学んだこと
- DockerでのPerl + Moo + Test2環境の構築
- TDDの基本サイクル(レッド→グリーン→リファクタリング)
- Mooでの基本的なクラス定義
- Test2::V0を使った基本的なテストの書き方
次回予告
次回は「MooによるTDD講座 #2 - メソッドのテストとTest2の機能」として、以下の内容を扱います。
- メソッドの追加とテスト
- Test2の便利な機能(like, match, arrayなど)
- 例外処理のテスト
- テストの構造化とサブテスト
お楽しみに!