<TIL> 59. Spring Test

YUJIN LEE·2023년 3월 15일
0

개발log

목록 보기
54/149

Test의 필요성

버그(bug)?

소프트웨어가 예상하지 못한 결과를 내는 것.
버그 - '소스 코드'나 '설계과정에서의 오류' 때문에 발생.

개발 코드 배포 전, 버그를 찾는 테스트 방법

블랙박스 테스팅

소프트웨어 내부 구조나 동작원리를 모르는 블랙박스와 같은 상태에서,
즉, 웹 서비스의 사용자 입장에서 동작을 검사하는 방법

  • 장점: 누구나 테스트 가능 - 개발자, 디자이너, 베타 테이터 등등
  • 단점
    • 기능이 증가될 수록 테스트 범위 증가.
      ** 시간이 갈수록 테스트 하는 사람 증가
    • 테스트 하는 사람에 따라 테스트 퀄리티의 차이 -> QA 직군이 있는 이유

개발자 테스트

개발자가 직접 "본인이 작성한 코드"를 검증하기 위해 "테스트 코드" 작성

  • 장점:
    • 빠르고 정확한 테스트 가능.(예상 동작 VS 실제 동작)
    • 테스트 자동화 가능
      ** 배포 절차 시 테스트 코드가 수행되어 동작 검증
    • 리팩토링이나 기능 추가 할 때 더욱 편리
  • 단점: 개발 시간 오래 걸림, 테스트 코드 유지보수 하는 비용..

JUnit을 이용한 단위 테스트

JUnit이란? 자바 프로그래밍 언어 용 단위 테스트 프레임워크

단위 테스트?

프로그램을 작은 단위로 쪼개 각 단위가 정확하게 동작하는지 검사,
이를 통해 문제 발생 시 정확히 어느 부분에서 잘못되었는지를 재빨리 확인.

  1. Development - 개발
  2. Unit Tests(단위 테스트) - 개발자 테스트
  3. QA Testing -
    • 블랙박스 테스팅
    • 주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅
  4. Production: 실 서비스 운영 환경

TDD?

Test-Driven Development
테스트 코드를 먼저 작성하고 실제 동작하는 코드를 개발하는 순서로 개발하는 개발 방법론.
설계 -> 테스트 -> 개발

Given-When-Then Pattern?

테스트 코드를 작성하는 가장 대표적인 방법론.
논란의 여지가 있지만, 가장 쉽게 시작할만한 방법.

Given - 준비 / When - 실행 / Then - 검증

package com.sparta.myselectshop.entity;

import com.sparta.myselectshop.dto.ProductRequestDto;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;
// (1)
class ProductTest {
    @Test // (2)
    @DisplayName("정상 케이스") // (3)
    void createProduct_Normal() {
        // (4) 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
        );

        // (5) when - 테스트하려는 로직 수행!
        Product product = new Product(requestDto, userId);

        // (6) then - 검증!
        assertNull(product.getId()); // (6-a)
        assertEquals(userId, product.getUserId()); // (6-b)
        assertEquals(title, product.getTitle());
        assertEquals(image, product.getImage());
        assertEquals(link, product.getLink());
        assertEquals(lprice, product.getLprice());
        assertEquals(0, product.getMyprice());
    }

}
  1. 테스트 클래스 자동 생성
  2. 테스트 클래스 메서드가 하나의 테스트 case 나타냄.
  3. 테스트에 라벨링 해주는 어노테이션. 실행결과에 나타남
  4. 각 테스트 흐름은 Given, When, Then 으로 작성. Given - 데이터 준비
  5. 실제로 테스트 해야하는 로직 실행.
  6. JUnit에서 제공해주는 검증 함수들.
    a. asserNull 함수는 주어진 인자(product.getId())가 null이어야 테스트를 통과시켜주는 함수.
    b. assertEquals 함수는 주어진 인자 두 개가 같아야 테스트 통과시켜주는 함수

Assert(JUnit API

단위테스트?

이상적으로, 각 테스트 케이스는 서로 분리된게 좋음.
-> 가짜 객체(Mock object) 생성

가짜객체(Mock object) 통한 분리 방법

  • 가짜 객체(Mock object)로 분리한다면?
  • mockProductRepository
    - 실제 객체와 겉만 같은 객체. 동일한 클래스명, 함수명
    • 실제 DB작업 X

Mockito mock 사용한 단위 테스트

mockito -> mock 객체들을 편리하게 만들고 관리해줌
mockito

profile
인정받는 개발자가 되고싶습니다.

0개의 댓글