반응형

테스트 코드의 필요성

  • 서버를 실행해서 직접 테스트 해보지 않아도 되기 때문에 시간 단축 가능
  • 테스트 코드를 통해 어떤 값이 주어졌을 때(given), 어떤 실행을 하면(when), 어떤 결과가 나와야 되는지(then)를 확인할 수 있기 때문에 코드를 파악하는데도 도움을 줄 수 있음
    • given - when - then
  • 수정사항 발생 시 기존의 코드에 영향을 주는지 테스트 코드를 통해 파악할 수 있음
  • 정확한 테스트 코드를 작성해 놓으면 실제 코드를 제대로 작성했는지 확인할 수 있음
    • 테스트 주도 개발 (TDD)
  • 이 외에도 여러가지 장점들이 있음

테스트 코드 예제

  1. 글 작성
  2. 글 보기
  3. 글 수정
  4. 글 삭제
  5. 글 전체 불러오기
    • 테스트를 위해 ContentService에 전체 글 개수를 조회하는 기능과 전체 글 삭제하는 기능 추가
  • ContentServiceTest 설계
  1. 글 쓰기 테스트
    • Content 생성 후 저장
    • 전체 글 개수가 1개인지 확인
  2. 글 보기(불러오기) 테스트
    • Content 생성 후 저장 => id가 1번으로 저장될 것임
    • 1번 글 조회 후 Content와 제목, 작성자, 비밀번호, 글 내용이 일치하는지 확인
  3. 글 수정 테스트
    • Content 생성 후 저장
    • 비밀번호를 틀리게 하고 수정 시도
    • 글 내용이 그대로여야 함
    • 비밀번호를 맞게 하고 새로운 내용으로 글 수정
    • 1번 글 조회 후 글 내용(texts)가 수정한 내용과 같는지 확인
  4. 전체 글 조회 테스트
    • 글 3개 등록
    • 전체 글 불러온 리스트의 크기가 3인지 확인
  5. 글 삭제 테스트
    • Content 생성 후 저장
    • 1번 글 삭제
    • 전체 글 개수가 0인지 확인
  • 다음부터는 저장, 수정등을 할 때 id나 객체 등을 return 하면 Test 할 때 더 좋을 것 같음

테스트 코드 생성 방법 ( IntelliJ/MAC )

  1. ContentService 클래스명 위에 커서를 놓고 단축키를 입력해 Test Code 생성
    • 단축키 1 : Shift(⇧) + Command(⌘) + T
    • 단축키 2 : Command(⌘) + N -> Test
  2. JUnit5 선택 후 생성

  1. 위와 같이 main쪽이 아닌 test쪽에 디렉토리 구조와 파일명을 자동으로 생성해줌

설계한 테스트 코드 구현

  • @SpringBootTest : @Autowired 사용 가능하게 해줌
  • @Autowired : ContentService를 주입받음
  • @BeforeEach : 각각의 테스트 시작 전 실행
  • @AfterEach : 각각의 테스트 종료 후 실행
  • @Test : 테스트임을 나타냄
  • @DisplayName : 화면에 보일 테스트명 지정
  • Assertions는 org.assertj.core.api 패키지의 Assertions 사용
  • Assertions.assertThat(실행값).isEqualTo(기대값); 이런 식으로 테스트 가능
  • Assertions를 static-import 해주면 assertThat만 써줘도 됨
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class ContentServiceTest {

    @Autowired
    ContentService contentService;

    Content content = null;

    @BeforeEach
    void beforeEach() {
        // 테스트를 시작 할 때 마다 content를 새로 생성
        // id와 updateDate는 자동 생성
        content = new Content();
        content.setTitle("글 제목");
        content.setWriter("작성자1");
        content.setPassword("1234");
        content.setTexts("글 내용");
    }

    @AfterEach
    void afterEach() {
        // 테스트가 끝날 때 마다 글 전체 삭제
        contentService.deleteAllContent();
    }

    @Test
    @DisplayName("1. 글 쓰기 테스트")
    void addTest() {
        contentService.writeContent(content);
        assertThat(contentService.getContentCount()).isEqualTo(1);
    }

    @Test
    @DisplayName("2. 글 보기(불러오기) 테스트")
    void getTest() {
        contentService.writeContent(content);

        Content findContent = contentService.getContent(1);

        assertThat(findContent.getTitle()).isEqualTo(content.getTitle());
        assertThat(findContent.getWriter()).isEqualTo(content.getWriter());
        assertThat(findContent.getPassword()).isEqualTo(content.getPassword());
        assertThat(findContent.getTexts()).isEqualTo(content.getTexts());
    }

    @Test
    @DisplayName("3. 글 수정 테스트")
    void editTest() {
        content.setTexts("원래 내용");
        contentService.writeContent(content);

        contentService.editContent(1, "수정 내용", "1");
        assertThat(contentService.getContent(1).getTexts()).isEqualTo("원래 내용");

        contentService.editContent(1, "수정 내용", "1234");
        assertThat(contentService.getContent(1).getTexts()).isEqualTo("수정 내용");
    }

    @Test
    @DisplayName("4. 전체 글 조회 테스트")
    void getAllTest() {
        // given
        contentService.writeContent(new Content());
        contentService.writeContent(new Content());
        contentService.writeContent(new Content());

        // when
        List<Content> contents = contentService.getAllContents();

        // then
        assertThat(contents.size()).isEqualTo(3);
    }

    @Test
    @DisplayName("5. 글 삭제 테스트")
    void deleteTest() {
        contentService.writeContent(content);
        assertThat(contentService.getContentCount()).isEqualTo(1);

        contentService.deleteContent(1, "");
        assertThat(contentService.getContentCount()).isEqualTo(1);

        contentService.deleteContent(1, "1234");
        assertThat(contentService.getContentCount()).isEqualTo(0);
    }

}

결과

  • ContentServiceTest 클래스를 실행시키면 테스트가 진행됨
  • Test를 하나씩 진행할 수도 있음
  • 테스트 통과 시
  • 테스트 실패 시 (기대값과 실행값을 확인할 수도 있음)
반응형

↓ 클릭시 이동

복사했습니다!