💯

テスト駆動開発(TDD)について

2023/10/19に公開

テスト駆動開発(TDD)ってなに?

Test Driven Development(テスト・ドリブン・デベロップメント)
直訳すると「テストに突き動かされた開発」

手順

  1. 目標を考える
  2. 目標を満たすテストを書く
  3. テストを失敗させる
  4. 目的のコードを書く
  5. テストを成功させる
  6. テストが全て通るまでリファクタリングをおこなう

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のときはどうする?」等も意見をいただき、最初にテストを作ることで、実装前に仕様を整理できるのだなと感じました。

個人的に「テスト先に作るの?時間かかるじゃん」と思っていましたが、メリットも大きいことが分かりました。

以下の記事で、質とスピードの関係について学びました。

https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition

コラボスタイル Developers

Discussion