TDDから始める方法


私が最初にコーディングを始めたとき、私はTDDが動作しなかったと感じました.
いくつかの時間が経過した後、私は別の結論に来ている.私が問題を処理する方法がわからないとき、私は時間の前にテストを作成することが問題を解決する方法を考え出すことにおいて最も役に立ちます.

TDDとは


TDDはテストドリブン開発を意味し、実際の生産コードの前にテストにフォーカスを置くことを意味します.
つのTDD法は、TDDを使用するときに従うべきプロセスを管理します.こちらは
  • 最初に失敗した単体テストを作成するまでは、任意のコードを書くことはできません.
  • あなたが失敗するのに十分であるより多くの単位テストを書くことができない、そして、コンパイルが失敗していない.
  • 現在失敗している単体テストに合格するのに十分な生産コードを書くことはできません.
  • これらの法則は、私たちが一度に一つのことに焦点を合わせることができて、変わることができるループで我々を含みます.これにより、小さなステップを取り、プロジェクトを段階的に構築できます.

    TDDでの作業の開始方法


    TDDで作業するとき、我々は常に大きな目標に到達するために小さなステップを取る.
    TDDを使用してコードをどのようにしたかを示すには、次のコードをコード化します.
    私はすべてのプロジェクトを作成することができますし、どのようなテストライブラリを好きなテストライブラリを作成することができます仮定しています
    以下の規則に従う単純な関数から始めましょう.
  • 駐車場のエントリと出口の日付を与え、正しい価格を返します.
  • 各時間は1ドルかかる
  • 私たちは常に完成した時間を使用してコストを計算するので、車が1 : 10時間駐車された場合、我々は2時間を請求します
  • さて、ルールを知っているので、コードを開発することができます.TDDを使用しているので、最初のステップはテストを作成することです.
    テストコードからコードを開始しているので、使用するインターフェイスについて考えやすくなります.この場合、我々は、我々が入力と出発時間を必要とするということを知っています.そこで、この情報を関数に渡す必要があります.
    私たちはtypescriptを使用しているのでDate この情報を渡すオブジェクト.
    最初のテストでは次のようになります.
    test("should return the correct price", () => {
      const enterDate = new Date('2022-03-27T10:00:00')
      const leaveDate = new Date('2022-03-27T12:00:00')
    
      const price = calculateParkingTicket(enterDate, leaveDate)
    
      expect(price).toBe(2)
    })
    
    テストが失敗したので、最終的に実際の機能について作業を開始できます.
    TDDに続いて、テストパスに必要なコード量を作成します.
    export const calculateParkingTicket = (enter: Date, leave: Date) => {
      return 2
    }
    
    今、私たちは合格テスト!
    我々は、このコードは完全に我々の本当の問題を解決していないにもかかわらず、あなたのテストパスを作るためにコードの適切な量を持っている.
    本当の問題がまだ解決されないならば、我々は新しいテストを書きます!
    test("should return the correct price when 5 hours passed", () => {
      const enterDate = new Date('2022-03-27T10:00:00')
      const leaveDate = new Date('2022-03-27T15:00:00')
    
      const price = calculateParkingTicket(enterDate, leaveDate)
    
      expect(price).toBe(5)
    })
    
    を、今私たちの関数から番号2を返すことはできません.もっと複雑な解決策を開発する必要がある.
    const PRICE_PER_HOUR = 1
    
    export const calculateParkingTicket = (enter: Date, leave: Date) => {
      const diferencesInMs = (leave.getTime() - enter.getTime())
      const diferencesInHours = diferencesInMs / (1000 * 60 * 60)
      return diferencesInHours * PRICE_PER_HOUR
    }
    
    よりよく見えます!しかし、車が2 : 30時間駐車されるならば、何が起こりますか?
    我々の規則によると、それは3ドルかかるので、この場合のためにテストを書きましょう
    test("should return the correct price 2:30 hours passed", () => {
      const enterDate = new Date('2022-03-27T10:00:00')
      const leaveDate = new Date('2022-03-27T12:30:00')
    
      const price = calculateParkingTicket(enterDate, leaveDate)
    
      expect(price).toBe(3)
    })
    
    今、我々は新しいテストがあるコードを開始することができます!
    const PRICE_PER_HOUR = 1
    
    export const calculateParkingTicket = (enter: Date, leave: Date) => {
      const diferencesInMs = (leave.getTime() - enter.getTime())
      const diferencesInHours = diferencesInMs / (1000 * 60 * 60)
      const hoursToPay = Math.ceil(diferencesInHours)
      return hoursToPay * PRICE_PER_HOUR
    }
    
    それで、これは我々のコードを終えます.すべてのルールを考慮してテストされます.
    今、我々はテストのおかげで任意のルールを破ることはありません確実に、我々は必要に応じて、ほとんどのコードをリファクタリングする無料です!

    結論


    tddを用いた基本例をコード化し,この手法を正しく適用する方法を示した.
    TDDとの作業では、私の意見では、インクリメンタルなステップを取る能力など、さまざまな利点があり、どのようにコードと対話するかを考慮し、もちろん、すべてが正しく動作することを確認します.
    しかし、このアプローチが現実世界で実装するのが難しいかもしれないことを心に留めておいてください.なぜなら、すべてのコードがテストするのに些細なことではないからです.
    TDDと共に、テスト可能なコードの作成を可能にする良いアーキテクチャを持つことは重要です.依存性注入などのパターンを使用すると、テスト可能なコードの作成にも役立ちます.