オタクくん「ギャル先輩、テスト駆動開発ってなんですか?」
オタクくん「うーん…テスト駆動開発って聞いたことあるけど、どうやって始めればいいのか全然わからないや。」
ギャル先輩「おっす、オタクくん。なんか悩んでるみたいじゃん?」
オタクくん「あ、ギャル先輩!テスト駆動開発(TDD)ってどうやるのか全然わからなくて…」
ギャル先輩「マジで?TDDは超基本じゃん。あーしが教えてあげるから、ちゃんとついてきてよねwww」
テスト駆動開発(TDD)とは?
オタクくん「まず、TDDって何なんですか?」
ギャル先輩「TDDはTest-Driven Developmentの略だよ。つまり、テスト駆動開発。開発の最初にテストを書いて、そのテストをパスするようにコードを書く方法だよ。」
オタクくん「え?最初にテストを書くの?普通はコードを書いてからテストするんじゃないですか?」
ギャル先輩「そう思うよね。でも、TDDは逆なの。最初にどういう動きをするかをテストで定義して、その後でそのテストをパスするようにコードを書くんだよ。」
TDDの基本的なサイクル
オタクくん「それってどうやるんですか?」
ギャル先輩「TDDの基本はRed-Green-Refactorサイクルだよ。次のステップで進めるの。」
- Red: まず失敗するテストを書く。これで現在のコードがテストをパスしないことを確認する。
- Green: テストをパスするための最低限のコードを書く。ここではとにかくテストをパスすることだけに集中する。
- Refactor: コードをリファクタリングして、綺麗で効率的なコードにする。リファクタリング後もテストがパスすることを確認する。
オタクくん「なるほど。失敗するテストを書いて、コードを書いて、最後にリファクタリングするんですね。」
ギャル先輩「そうそう。じゃあ、実際にやってみようか。」
実際にTDDをやってみる
ギャル先輩「まずは、簡単な例として、数を2倍にする関数を作ってみよう。」
オタクくん「はい!」
ギャル先輩「最初に失敗するテストを書こう。テストフレームワークはJUnitを使うよ。」
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class DoubleNumberTest {
@Test
void testDoubleNumber() {
assertEquals(4, doubleNumber(2));
}
}
オタクくん「おお、これが最初のテストですね。」
ギャル先輩「そうだね。次に、このテストをパスするための最低限のコードを書こう。」
class DoubleNumber {
static int doubleNumber(int number) {
return number * 2;
}
}
オタクくん「これでテストがパスするんですね!」
ギャル先輩「そうだよ。最後に、リファクタリングしてコードを整理するけど、今回はこれで十分シンプルだからリファクタリングは必要ないね。」
TDDのメリット
オタクくん「TDDを使うとどんなメリットがあるんですか?」
ギャル先輩「TDDにはいくつかのメリットがあるよ。」
- コードの品質向上: 最初にテストを書くことで、コードが意図した通りに動作することを確認できる。
- バグの早期発見: テストを書くことで、バグを早期に発見できる。
- リファクタリングが容易: テストがあることで、安心してリファクタリングができる。
オタクくん「なるほど、確かにメリットがたくさんありますね。」
TDDのデメリット
オタクくん「でも、TDDにもデメリットはあるんですよね?」
ギャル先輩「うん、もちろんデメリットもあるよ。」
- 最初の学習コスト: TDDの考え方を学ぶには時間がかかる。
- 開発速度: 最初はテストを書くので、開発速度が遅く感じることがある。
- テストのメンテナンス: テストコードもメンテナンスが必要で、コードが変更されるたびにテストも更新しなければならない。
オタクくん「でも、そのデメリットを理解しても、TDDはやる価値があるんですね。」
ギャル先輩「そうだね。特に大規模なプロジェクトや長期間メンテナンスするプロジェクトでは、TDDは非常に有効だよ。」
オタクくん「ギャル先輩、ありがとうございました!TDDの基本が少しわかりました!」
ギャル先輩「いえいえ、どういたしまして。これからも頑張ってねwww」
オタクくん「はい!もっと勉強して、ギャル先輩みたいなエンジニアになりたいです!」
ギャル先輩「それは嬉しいこと言ってくれるじゃんwww でも、あーしを超えるにはまだまだだよ?www」
Discussion