開発テスト主導(TDD)


TDD(Test Driven Development)
→その名の通り、テストを主導してプログラムを開発する方法.
従来の方法は、プログラム開発が完了した後、プログラムが正常に動作しているかどうかをテストすることです.しかし,テスト主導開発(TDD)は,プログラムを開発する際,まずテストコードを記述し,その後テストコードを通過する実際のコードを生成する.
例)
私たちが家を建てるとします.
家を建てるために、どこでどれだけのレンガを積むか、特定のエリアで線で表示し、レンガが表示された部屋に積まれるとレンガが満たされ、レンガを積むのを止めます.
TDDをここにたとえると、実際には指定された領域を「テストコード」にたとえることができ、実際にレンガを積むプロセスを「実際のコード」にたとえることができます.レンガを積むとき、レンガが突き出たり、形が合わなかったりしたら、線で判断します.
→つまり、「線」というテストコードは「煉瓦積み」という実際のコードが進む方向を示している.
レンガを積むときにレンガが少し傾いたら、また平らにしなければならない.これはリニューアルにたとえることができる.
💡 再構築は、ソースコード機能を保持した上で、ソースコード設計を改善する方法です.
TDDストリーム
TDDの一般的な流れは以下の通りです.
  • 何をテストするかを考えます.
  • の作成に失敗したテスト.
  • でテストされたコードを記述します.
  • コードを再パッケージします.(テストコードも再設計します.)
  • 実施すべき内容があるまで、ステップ
  • を繰り返す.
  • ここでNは「最も簡単なコードが生成されるまで」である.
    JavaマスターメソッドとJUnit、AssertJの説明
    1.Javaのマスターメソッド
    →プログラムの起動とテスト実施のためのプログラム
    mainメソッドを使用してテストする欠点
  • クラスとmainメソッドの増加に伴い、テストの大規模なプロジェクトは複雑になります.
  • メソッド(main)には複数のテストコードがあり、どのテストがどのように実現されているのか分かりにくい.
  • テスト結果は、1人ずつ確認する必要があります.
  • TDDのメリット
  • TDDは、コードの再利用を保証することができる.したがって,ソフトウェア開発においては,機能モジュール化が徹底される.→必要に応じてモジュールを追加または削除し、ソフトウェア全体の構造に大きな影響はありません.
  • のテストコードを最初に作成するので、開発者が実現する必要がある部分に直感的になりやすい.→テストコード作成時に様々な例外が考慮されているため、開発中にソフトウェア全体の設計が変更されることはない.
  • TDDの場合、エラーは簡単に見つかります.→各機能のテストコードを事前に想定していたので、エラーを見つけやすい.
  • TDDの欠点
  • は生産性が低い.
    →最初から2つのコード(テストコード、実際のコード)を書くので、中間テストの場合は
  • を修正する

  • ソフトウェアをすばやく作成する必要がある場合は、実際のコードのみを作成するとより効果的です.
    ソフトウェアの品質・完成度を向上させるためにTDD方式が有効である.
    JUnitとAsserJ
    JUnit
    テストコードを使いやすいJavaライブラリ
    AssertJ
    様々な断言を提供するJavaライブラリ.
    →テストコードの読みやすさを向上させる.(Junitが提供する方法よりも毒性が大きい)
    IntelliJでTDDとグラデーションを設定(Java 11,IntelliJ)
    1
    JAvaはコンパイル言語です.
    .javaファイルを実行するわけではありません.JAvaのコンパイル結果.classを実行させることです.
    プロジェクト構造を初めて構築する場合は、IntelliJのようなIDEにあります.classファイルを含むパスを知っておく必要があります.これをclassPath設定と呼びます
    2
    gradeを使用する場合は、classpathの設定が良好であることを確認します.
    →テストコードを実行するため.classの位置を理解します.
    まずはプロジェクトのゾウ模様のビルドgradleシェイプのフォルダをクリックし、pluginにjavaが含まれていることを確認します.

    gradleは、デフォルト設定を使用してbuildフォルダにコンパイルされたソース構造を作成します.
    3.AssertJの追加
    まず、それらを利用してassertJに参加します.
    →Javaバージョンが8より大きい場合は、assertJを3.0以降に設定します.以前のバージョンは2です.Xバージョンに設定

    4.TDDを味わう
    1.テストフォルダの設定

    Project/src/testフォルダで、緑色javaフォルダをクリックすると、テストフォルダを設定できます.

    javaフォルダをtestフォルダに設定するには、次のようにします.
    2.簡易計算機テストの作成
    java/Calculator.Javaの作成後にコードを記述する
    public class Calculator {
    
        int num1;
        int num2;
    
        public Calculator(int num1, int num2) {
            this.num1 = num1;
            this.num2 = num2;
        }
    
        public int add(int num1, int num2){
            return num1 + num2;
    
        }
    }
    ソースコードを作成し、command+shift+tの略語でテストを作成します.

    必要なバージョンのJUnitを設定し、テストファイルを作成します.

    これでテストフォルダにCalculatorTestファイルが作成されていることがわかります.

    TDDは本当に始まります
    Java/Calculatorではコンストラクション関数しかありません.すなわち,計算機の実際の機能にはadd,sub,mulなどはない.
    TDD方式でaddメソッドを作成します.つまり、まずテストファイルを作成し、実際のコードを作成します.
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    class CalculatorTest {
    
        
        @Test
        @DisplayName("add 함수를 위한 테스트 코드 입니다.")
        void add() {
            
            Calculator calculator = new Calculator(1,2);
            
            assertThat(calculator.add(1,2)).isEqualTo(3);
    
            
        }
    
    }
    ファイルを作成してテストすると、正常に動作しているかどうかを確認できます.
    実行画面
    テスト1+2が3かどうか

    ししんえんざんほすう
    public class Calculator {
    
        int num1;
        int num2;
    
        public Calculator(int num1, int num2) {
            this.num1 = num1;
            this.num2 = num2;
        }
    
        public int add(int num1, int num2){
            return num1 + num2;
    
        }
    
        public int sub(int num1,int num2){
            return num1 - num2;
    
        }
    
        public int  div(int num1, int num2) {
            return  num1/num2;
    
        }
    
        public int mul(int num1, int num2) {
            return  num1*num2;
        }
    }
    テストコード
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    class CalculatorTest {
        Calculator calculator = new Calculator(1,2);
    
        @BeforeEach
        void setUp() {
            calculator = new Calculator(1, 2);
        }
    
        @Test
        @DisplayName("add 함수를 위한 테스트 코드 입니다.")
        void add() {
    
            assertThat(calculator.add(1,2)).isEqualTo(3);
    
        }
    
        @Test
        @DisplayName("sub 함수를 위한 테스트 코드 입니다.")
        void sub() {
    
            assertThat(calculator.sub(10,5)).isEqualTo(5);
        }
    
        @Test
        @DisplayName(" div 함수를 위한 테스트 코드 입니다.")
        void div() {
    
            assertThat(calculator.div(6,2)).isEqualTo(3);
        }
    
        @Test
        @DisplayName("mul 함수를 위한 테스트 코드 입니다.")
        void mul() {
    
            assertThat(calculator.mul(2,5)).isEqualTo(10);
    
        }
    }