Spring深化班-第3週-1

16551 ワード

2022年4月16日(土)
[スパルタコードクラブ]Spring深化クラス-3週目-1

◇テスト


  • 開発に伴い、バグは不可欠な存在である.そのため、導入前にできるだけ多くのエラーを特定する必要があります.エラーはどこで発生するかもしれないので、最も効果的に検索することが重要です.

  • テスト要件
  • エラーが検出された時間に基づいて、コストは指数関数的に増加するため、導入前にできるだけ多くのエラーを検索する必要があります.

  • テストの種類
  • ユニットテスト
  • モジュールまたはクラスの詳細なテスト
  • モジュール間でインタラクティブ検証ができない
  • 統合テスト
  • は、2つ以上のモジュールの接続状態
  • をテストする.
  • モジュール間の接続検証エラー
  • E 2 Eテスト(=ブラックボックステスト)
  • 実際のユーザとほぼ同じ環境で
  • をテストする.

  • Springのテストフレームワークにより、複数のEdgeエンクロージャを簡単かつ迅速にテストできます.△この方法には多くの利点と欠点があり、状況に応じて使用することができる.
  • ◇JUnitでユニットテスト


  • ユニットテスト:プログラムを小さなユニットに分けて、各ユニットが正しく動作しているかどうかを確認し、問題が発生したときにどの部分が間違っているかを迅速かつ正確に決定します.

  • JUnit使用設定:build.gradleにはJUnitを使用する環境が設定されています.
  • testImplementation 'org.springframework.boot:spring-boot-starter-test'
  • のテストファイルを作成します.
  • ファイルを右クリック>Generate...>"Test...">デフォルト設定作成
  • src>test>javaパッケージの下にクラス
  • を作成
  • 簡易試験コード例
  • // Product가 잘 되어있는지 확인
    class ProductTest {
        @Test // 테스트용 함수에 표기
        @DisplayName("정상 케이스") // 테스트 결과 볼 때, 해당 이름으로 표기
        void createProduct_Normal() {
            // given
            Long userId = 100L;
            String title = "오리온 꼬북칩 초코츄러스맛 160g";
            String image = "https://shopping-phinf.pstatic.net/main_2416122/24161228524.20200915151118.jpg";
            String link = "https://search.shopping.naver.com/gate.nhn?id=24161228524";
            int lprice = 2350;
    
            ProductRequestDto requestDto = new ProductRequestDto(
                    title,
                    image,
                    link,
                    lprice
            );
    
            // when
            Product product = new Product(requestDto, userId);
    
            // then
            assertNull(product.getId());  // 빈 값인지 확인
            assertEquals(userId, product.getUserId()); // assertEquals(예상값, 실제값)
            assertEquals(title, product.getTitle());
            assertEquals(image, product.getImage());
            assertEquals(link, product.getLink());
            assertEquals(lprice, product.getLprice());
            assertEquals(0, product.getMyprice());
        }
    }
  • 実行結果はハングルとして表示されません
    ->ファイル設定-検索ウィンドウにgrade
  • と入力します.

    ◇Edgeエンクロージャに対するユニットテスト


  • データを送信する際にクライアントが入力した値を考慮しても,サーバは考慮する必要がある.
    ex)商品画像がURL形式でない場合、会員IDがnullまたは「」の場合、商品名はありません...

  • したがって、データベースに密接に関連するクラスについては、その値を例外として処理します.そうしないと、エラーが発生します(Exceptionを単独で作成すると、ケースによって簡単に区別できます).
  •   // 예시
      // 입력값 Validation
            if (userId == null || userId <= 0) {
                throw new IllegalArgumentException("회원 Id 가 유효하지 않습니다.");
            }
  • のテスト設計では、エラーが発生していないかどうかを確認するためにEdge Caseを設計します.
  • // key annotation
    @Nested // 클래스에서 생성, 하위에 함수를 작성하여 설계
    @BeforeEach // 각 Test 전에 해당 행동 실행
    
    // 예시
    class ProductTest {
    
        @Nested
        @DisplayName("회원이 요청한 관심상품 객체 생성")
        class CreateUserProduct {
    
            private Long userId;
            private String title;
            private String image;
            private String link;
            private int lprice;
    
            @BeforeEach
            void setup() {
                userId = 100L;
                title = "오리온 꼬북칩 초코츄러스맛 160g";
                image = "https://shopping-phinf.pstatic.net/main_2416122/24161228524.20200915151118.jpg";
                link = "https://search.shopping.naver.com/gate.nhn?id=24161228524";
                lprice = 2350;
            }
    
            @Test
            @DisplayName("정상 케이스")
            void createProduct_Normal() {
                // given
                ProductRequestDto requestDto = new ProductRequestDto(
                        title,
                        image,
                        link,
                        lprice
                );
    
                // when
                Product product = new Product(requestDto, userId);
    
                // then
                assertNull(product.getId());
                assertEquals(userId, product.getUserId());
                assertEquals(title, product.getTitle());
                assertEquals(image, product.getImage());
                assertEquals(link, product.getLink());
                assertEquals(lprice, product.getLprice());
                assertEquals(0, product.getMyprice());
            }
    

    ◎ TDD (Test-Driven Development)


  • AS-IS設計→開発→テスト(→設計修正)順
  • TO-BE設計→テスト(→設計修正)→開発
    ->関連コンテンツはGoogle(講師が直接試してみることをお勧めし、違いを感じてください)
  • を使用してください

    ◇直接Mock Object実施によるユニットテスト

  • 製品サービスユニットのテストにはレポートが必要です.
  • 理想的には、各テストエンクロージャは互いに隔離されている必要があります->偽のオブジェクトが必要
  • MockService
  • 実際のサービスでは名前のみを使用してMockServiceを作成する
  • MockRepository:
  • 実際のレポートと同じオブジェクト(同じクラス名、同じ関数名)
  • DBオペレーションの入力値と戻り値は同じ(実際のデータベースオペレーションを使用しない)
  • である.
  • テスト:MockService、MockRepositoryテスト
  • を使用

  • 短所
  • bean、IoCは使用できません.
  • サービスを変更する場合は、MockService、MockRepositoryを大幅に変更する必要がある
  • .

  • 製作・使用が容易なMockitoは実用性が高い.