Spring BootとAWSが単独で実施するWebサービス[2]


🐯 第02章Spring Bootでテストコードを作成する🐯

  • テストコード概要
  • 作成
  • Hello Controllerテストコード
  • ロム服の紹介と取り付け
  • Hello ControlコードをROM服
  • に変換する.
    最近の傾向は、多くのサービス会社がコードのテストを要求していることです.第二章はプロジェクトの中で最も重要なテストコードの作成の基本的な知識を学ぶ.

    1.テストコードの概要


    TDDとユニットテストンは違う物語です.TDDとはテスト主導の開発であり,テストコードの作成から始まる.逆に、ユニットテストとは、TDDを記述する最初のステップ、すなわち機能ユニットのテストコードである.

    なぜユニットテストコードを作成するのか

  • ユニットテストは、開発段階で問題を早期に発見するのに役立ちます.
  • ユニットテストにより、開発者が後でコードを再パッケージまたはライブラリアップグレードするときに、既存の機能が正常に動作することを保証します.
  • ユニットテストは、機能に対する不確実性を低減することができる.
  • ユニットテストは、システムに関する実際のドキュメントを提供します.△ユニットテスト自体を文書化することができます.
  • 筆者の経験談

  • クイックフィードバック(猫のシャットダウンと再稼働を減らす)
  • 手動検証なしで自動検証できる
  • セキュリティ保護
  • 開発者が作成した機能
  • 最も一般的なテストフレームワークはxUnitです.開発環境(x)に基づいてユニットテストを支援するツールです.
  • Junit - java
  • DBUnit - DB
  • CppUnit - C++
  • NUnit - .net
  • その中でJava専用のJUnitが使われています.(特にJUnit 4を使う)

    2.Hello Controllerテストコードの作成


    作成したプロジェクトにパッケージを作成します.一般的に、パッケージ名はウェブサイトのアドレスの逆順序です.(はい-admin.jojodu.com-->com.jojodu.admin)

    アプリケーションクラスの作成


    生成されたパッケージにアプリケーション名でJavaクラスを作成し、次のようにクラスのコードを記述します.
    package com.jojoldu.book.springbootaws;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
        public static void main(String[] args){
            SpringApplication.run(Application.class,args);
        }
    }
    
    このアプリケーションクラスは、将来作成するプロジェクトのメインクラスです.@SpringBootアプリケーションでは、スプリングの起動、読み取り、およびスプリングbeanの作成を自動的に設定できます.特に、@SpringBootApplicationが存在する場所から設定を読み込むため、このクラスは常にプロジェクトの上部にある必要があります.
    プライマリ・メソッドで実行されるSpringApplication.run組み込みWebアプリケーションサーバ(WAS)を実行します.
    埋め込みWASとは、アプリケーションの実行時にWASを内部で実行することであり、WASを外部に単独で置くことではない.これにより、Tomcatを常にサーバにインストールする必要がなくなり、Spring Bootによって作成されたJarファイル(実行可能なJavaパッケージファイル)を実行するだけで済みます.

    コントローラクラスの作成


    現在の饅頭項目にwebパッケージを作成します.このパッケージには、コントローラに関連するすべてのクラスが含まれます.コントローラクラスを作成します.
    package com.jojoldu.book.springbootaws.web;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @GetMapping("/hello")
        public String hello(){
            return "hello";
        }
    
        
    }
    コントローラクラスの内容.
  • @RestControl:コントローラをJSONに戻すコントローラにします.
  • @GetMapping:Getリクエストを受信できるAPIを作成します.
  • これで、/helloリクエストを受信したときに文字列helloを返す機能があります.

    テストコードの作成


    WASを実行せず、作成したコードが正常に動作しているかどうかをテストコードで検証します.src/test/javaディレクトリで、前に作成したパッケージを再生成します.次に、テストコードを記述するクラスを作成します.テストクラス名にTestを追加します.
    package com.jojoldu.book.springbootaws.web;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    
    
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(controllers = HelloController.class)
    public class HelloControllerTest {
        
        @Autowired
        private MockMvc mvc;
        
        @Test
        public void hello가_리턴된다() throws Exception{
            String hello = "hello";
            
            mvc.perform(get("/hello"))
                    .andExpect(status().isOk())
                    .andExpect(content().string(hello));
        }
        
    }

  • RunWith(SpringRunner.class):テスト時にJUnitに組み込まれた実行者のほかに、他の実行者も実行されます.SpringRunnerというスプリングアクチュエータを使用します.すなわち、ばね起動試験とJUnitとの間で接続者として機能する.

  • WebMvcTest:複数のスプリングテスト言語の中で、Webの言語に集中することができます.宣言には@Controller、@Controller Addiceなどを使用できますが、@Service、@Component、@Repositoryは使用できません.ここではコントローラのみを使用するので宣言します.

  • @Autowired:spring管理を受け入れる空き.

  • private MockMvc mvc:Web APIをテストします.スプリングMVCテストの開始点です.このクラスではHTTP GET,POSTなどに対してAPIテストを行うことができる.

  • mvc.perform("/hello"):MockMvcを介して/helloアドレスにHTTP GET要求を発行します.フィルタをサポートし、以下のように複数の検証機能を連続的に宣言できます.

  • .andExpect(status().isOk()) : mvc.performの結果を検証し、HTTPヘッダの状態を検証します.(例えば、200404500、Ok-200)

  • .andExpect(content().string(hello)) : mvc.performの結果を検証し、応答本文の内容を検証します.コントローラは「hello」を返し、値が正しいことを確認します.
  • 上記のテストを実行します.

    3.ロムウェアの紹介と取り付け


    Javaを開発する際、ROM福は一般的なコードGetter、Setter、基本ジェネレータ、toStringなどを自動的に生成します.IntellieJでは、プラグインを利用して簡単に設定できます.

    プロジェクトにロムフォードを追加


    build.gradeに次のコードを追加します.
    compile('org.projectlombok:lombok')
    Refreshにリフレッシュしてライブラリを取得します.
    ライブラリが受信されている場合は、ロムフォードプラグインをインストールします.Actionを検索し、プラグインにLombokをインストールします.

    4.Hello ControllerコードをROM福に変換


    まずdtoパッケージをwebパッケージに追加します.その後、すべての応答DtoがDtoパッケージに追加されます.このパッケージにHelloResponseDtoを作成します.
    package com.jojoldu.book.springbootaws.dto;
    
    import lombok.Getter;
    import lombok.RequiredArgsConstructor;
    
    @Getter
    @RequiredArgsConstructor
    public class HelloResponseDto {
        private final String name;
        private final int amount;
    }
    
  • @Getter:すべての宣言フィールドを生成するgetメソッド
  • @RequiredArgConstructor:宣言されたすべてのfinalフィールドを含むジェネレータを作成します.finalがないフィールドは作成者に含まれません.
  • テストコードの作成

    package com.jojoldu.book.springbootaws.web.dto;
    
    import org.junit.Test;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    public class HelloResponseDtoTest {
    
        @Test
        public void 롬복_기능_테스트(){
            String name = "test";
            int amount = 1000;
    
            //when
            HelloResponseDto helloResponseDto = new HelloResponseDto(name,amount);
    
            //then
            assertThat(helloResponseDto.getName()).isEqualTo(name);
            assertThat(helloResponseDto.getAmount()).isEqualTo(amount);
    
    
        }
    }
  • AsserThat:asserJは検証ライブラリをテストする検証方法です.検証するオブジェクトをメソッドパラメータとして受け入れ、メソッドフィルタリングをサポートし、isEqualtoと同様にメソッドを継続します.
  • isEqualto:assertJの同等比較方法.assertThatの値をisEqualtoの値と比較すると、同じ場合にのみ成功します.
  • assertJのassertThat:junit以外のassertThatのassertJの利点はCoreMatchersとは異なり、追加のライブラリを必要とせず、より信頼性の高い自動完了をサポートすることです.
    テストを行います.

    HelloControllerでResponseDtoを使用する

        @GetMapping("/hello/dto")
        public HelloResponseDto helloDto(@RequestParam("name") String name,@RequestParam("amount") int amount){
            return new HelloResponseDto(name,amount);
        }
  • @RequestParam:APIに渡されるパラメータを外部から取得する方法.メソッドパラメータには、外部からnameというパラメータが渡されます.
  • nameとamountは、APIを呼び出す場所で渡される値です.

    テスト

        @Test
        public void helloDto가_리턴된다() throws  Exception{
            String name = "hello";
            int amount = 1000;
            
            mvc.perform(
                    get("/hello/dto")
                            .param("name",name)
                            .param("amount",String.valueOf(amount))
            )
                    .andExpect(status().isOk())
                    .andExpect(jsonPath("$.name",is(name)))
                    .andExpect(jsonPath("$.amount",is(amount)));
        }

  • param:APIテストで使用するリクエストパラメータを設定します.単一値はStringのみを許可します.数値/日付などのデータを登録するには、文字列に変更する必要があります.( String.valueOf(int) )

  • jsonPath:JSON応答値のフィールド検証方法.$データムにフィールド名を指定します.