💯
テスト駆動開発(TDD)について
テスト駆動開発(TDD)ってなに?
Test Driven Development(テスト・ドリブン・デベロップメント)
直訳すると「テストに突き動かされた開発」
手順
- 目標を考える
- 目標を満たすテストを書く
- テストを失敗させる
- 目的のコードを書く
- テストを成功させる
- テストが全て通るまでリファクタリングをおこなう
1~6を繰り返す
メリット
- 要件や仕様を理解しやすくなる。
⇒仕様が分かっていないと、テストが書けない - バグ・仕様不備を早期に発見できる。
- 開発の心理的負担が軽減される。
⇒有名な和田さんは心理的なことがTDDの最大の理由とも言っている。
https://www.slideshare.net/t_wada/the-spirit-of-tdd
デメリット
- 慣れる、習得するのに時間がかかる。
- テストの実装、保守に時間がかかる。
やってみる
お題
入力された数値をプリントしたい。
ただし、3の倍数のときは「Fizz」、5の倍数の時は「Buzz」、3と5の倍数の時は「FizzBuzz」とプリントしたい。
このお題で必要となる関数のテストを書く。
Typescript × Jest でテストを書いてみる
最近Typescriptの勉強会に参加し、せっかくなので使ってみたいと思います。
describe('入力された数値をプリントするテスト', () => {
it('3と5の倍数のではない場合', () => {
expect(fizzBuzz.print(2)).toBe(2);
});
it('3の倍数の場合', () => {
expect(fizzBuzz.print(6)).toBe('Fizz');
});
it('5の倍数の場合', () => {
expect(fizzBuzz.print(20)).toBe('Buzz');
});
it('5と3の倍数の場合', () => {
expect(fizzBuzz.print(15)).toBe('FizzBuzz');
});
});
テストを書いた後に実装してみる
export class fizzBuzz {
public static print(num: number): string | number {
if (num % 3 === 0 && num % 5 === 0) {
return 'FizzBuzz';
} else if (num % 3 === 0) {
return 'Fizz';
} else if (num % 5 === 0) {
return 'Buzz';
} else {
return num;
}
}
}
学び
このお題を勉強会で出題したのですが、「3と5の倍数以外の数字は何を返せばいいのかわからん」と言われて、「そのまま数字返せばOKとします。なので、今回はStringかNumberが返る関数にしよう」と答えました。
「仕様がわかっていないと書けない」が体感できました☺️
メンターからは、「マイナスや0のときはどうする?」等も意見をいただき、最初にテストを作ることで、実装前に仕様を整理できるのだなと感じました。
個人的に「テスト先に作るの?時間かかるじゃん」と思っていましたが、メリットも大きいことが分かりました。
以下の記事で、質とスピードの関係について学びました。
Discussion