ダミーのためのTDDの方法


テスト駆動開発とは? 👀


  • テストに開発をリードさせるプロセスです.
  • 失敗するテストを書き、合格する本番コードを書きます.

  • テストに名前を付けるには? 🧠


  • Give_When_Then 形式に従うのが好きです.
  • 3 つのことを指定します
    -テストのために事前に定義された条件 (所与)
    -テストされるアクション (いつ)
    -我々が待つ結果 (それから)

  • TDD ルール ⚖️



    ボブおじさんによると、TDD には 3 つのルールがあります

    次のことは許可されていません.
  • 失敗したテストに合格するためでない限り、製品コードを記述します.
  • 単一の失敗したテストに合格するのに十分な量よりも多くの製品コードを記述します.
  • 失敗するのに十分な量よりも多くの単体テスト コードを記述します.
  • コンパイルの失敗は失敗と見なされます.


  • 告白🤭


  • 私は常にこれらのルールに従っていません.
  • テストに合格するよりも多くの本番コードを書くこともあれば、テストなしでコードを書くこともあります.
  • それは人間の本性だと思います、私たちは常に規則に従うことはできません

  • 電卓のコード例 🧮



    要件を見てみましょう


  • このメソッドは、文字列として 0、1、または 2 つの数値を受け取ることができ、それらの合計を返します (空の文字列の場合は 0 を返します)

  • 👉 まずは空文字列ケースを扱うコードを書いてみましょう

        @Test
        public void givenEmptyString_Return0(){
            CalculatorService calculatorService = new CalculatorService();
            int result = calculatorService.getSum("");
            assertEquals(0, result);
        }
    


    このコードを記述すると、CalculatorService とその getSum メソッドが存在しないため、コンパイル エラーが発生します.
    そのため、サービスとそのメソッドを作成し、空の文字列に対して 0 を返す単純なロジックを記述します.

    public class CalculatorService {
        public int getSum(String s) {
            if (s.isEmpty())
                return 0;
            else
                return 1;
        }
    }
    


    メソッドから値を返す必要があるため、else ステートメントの 1 は、コンパイラ エラーを回避するために使用される任意の値であることに注意してください.


    👉 では、数字1個の文字列を扱うテストを書いてみましょう

        @Test
        public void givenAStringWith1Number_ReturnIt_WhenCalculateSum(){
            CalculatorService calculatorService = new CalculatorService();
            int result = calculatorService.getSum("5");
            assertEquals(5, result);
        }
    


    このテストを最初に実行すると、戻り値が 1 になるため失敗します.

        public int getSum(String s) {
            if (s.isEmpty())
                return 0;
            else if (s.length() == 1)
                return Integer.parseInt(s);
            else
                return 1;
        }
    



    👉 次に、2 つの数字で文字列を処理するテストを書きましょう

        @Test
        public void givenAStringWith2Numbers_WhenCalculateSum_ThenReturnSum(){
            CalculatorService calculatorService = new CalculatorService();
            int result = calculatorService.getSum("69");
            assertEquals(15, result);
        }
    


    1 は 15 に等しくないため、このテストは失敗します.
    機能させましょう

        public int getSum(String s) {
            if (s.isEmpty())
                return 0;
            else if (s.length() == 1)
                return Integer.parseInt(s);
            else
                return getSumForMultipleNumbers(s);
        }
    
        private int getSumForMultipleNumbers(String s) {
            return Arrays.
                    stream(s.split("")).
                    mapToInt(Integer::parseInt).
                    sum();
        }
    


    お祝い🥳



    TDD を適用して、非常に単純な電卓をプログラムしました。



    さらに読む 👨‍🏫







    GitHub のコード👩‍💻