새소식

BackEnd/스프링부트3 백엔드 개발 입문

[Spring Boot] 13. 테스트 코드 작성하기

  • -

 

테스트 실행과 결과 처리

 

 

 최근에는 테스트 도구를 이용해 반복적인 검증 절차를 자동화하고 있다. 테스트 도구를 활용해 코드를 검증한다는 것은 테스트 코드(test code)를 작성해 실행한다는 것이다. 작성한 코드가 테스트를 통과하면 지속적인 리팩터링으로 코드를 개선하고, 통과하지 못하면 잘못된 부분을 찾아 고치는 디버깅(debugging)을 해야 한다.

 

· 테스트(test)

- 프로그램의 품질을 검증하는 것

- 의도대로 프로그램이 잘 동작하는지 확인하는 과정

 

· 테스트 주도 개발(TDD, Test Driven Development)

- 일단 테스트 코드를 만든 후 이를 통과하는 최소한의 코드부터 시작해 점진적으로 코드를 개선 및 확장하는 개발 방식

 

테스트 주도 개발

 

 

 

 

 

 앞서 만든 ArticleService를 검증하는 테스트 코드를 만들어보자. ArticleService의 index() 메서드에 우클릭 후에 Generate -> Test를 선택하자.

 

index() 메서드의 테스트 코드 만들기 (1)

 

Create Test 창에서 Testling Library는 JUnit5로 선택하고 Member에서 index():List<Article>에 체크한다.

 

index() 메서드의 테스트 코드 만들기 (2)

 

 

 

 

 

 ArticleServiceTest 코드를 살펴보면 위에 @SpringBootTest를 붙인다. 이는 해당 클래스를 스프링 부트와 연동해 통합 테스트를 수행하겠다고 선언하는 것이다. @Test 어노테이션을 통해 해당 index() 메서드가 테스트 코드임을 선언하고 ArticleService 객체를 테스트하기 위해 articleService 객체를 선언하고 @Autowired를 통해 외부 객체를 주입해준다.

 

src > test > java > com.example.firstproject > service > ArticleServiceTest

package com.example.firstproject.service;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*; // 앞으로 사용할 수 있는 패키지 임포트

@SpringBootTest // 해당 클래스를 스프링 부트와 연동해 테스트
class ArticleServiceTest {

    @Autowired
    ArticleService articleService; // articleService 객체 주입

    @Test // 해당 메서드가 테스트 코드임을 선언
    void index() {

    }
}

 

 

 

 

 

src > test > java > com.example.firstproject > service > ArticleServiceTest

@Test
void index() {
    // 1. 예상 데이터 작성하기

    // 1-1. 예상 데이터 객체로 저장
    Article a = new Article(1L, "가가가가", "1111");
    Article b = new Article(2L, "나나나나", "2222");
    Article c = new Article(3L, "다다다다", "3333");

    // 1-2. a, b, c 합쳐서 배열로 만들기
    List<Article> expected = new ArrayList<Article>(Arrays.asList(a, b, c));

    // 2. 실제 데이터 획득하기
    List<Article> articles = articleService.index();

    // 3. 예상 데이터와 실제 데이터 비교 검증하기
    assertEquals(expected.toString(), articles.toString());
}

 

· Arrays.asList(). 메서드

- Arrays.asList() 메서드는 입력된 배열 또는 2개 이상의 동일한 타입 데이터를 정적 리스트로 만들어 반환한다.

- 정적 리스트는 고정 크기이므로 add()나 remove() 메서드를 사용할 수 없다.

 

 

src > test > java > com.example.firstproject > service > ArticleServiceTest

@Test
void show_성공_존재하는_id_입력() {

    // 1. 예상 데이터 작성하기
    Long id = 1L;
    Article expected = new Article(1L, "가가가가", "1111");

    // 2. 실제 데이터 획득하기
    Article article = articleService.show(id);

    // 3. 예상 데이터와 실제 데이터 비교 검증하기
    assertEquals(expected.toString(), article.toString());
}
@Test
void show_실패_존재하지_않는_id_입력() {

    // 1. 예상 데이터 작성하기
    Long id = -1L;
    Article expected = null;

    // 2. 실제 데이터 획득하기
    Article article = articleService.show(id);

    // 3. 예상 데이터와 실제 데이터 비교 검증하기
    assertEquals(expected, article);
}

 

 

 

 

 

src > test > java > com.example.firstproject > service > ArticleServiceTest

@Transactional
@Test
void create_성공_title과_content만_있는_dto_입력() {

    // 1. 예상 데이터 작성하기
    String title = "라라라라";
    String content = "4444";
    ArticleForm dto = new ArticleForm(null, title, content);
    Article expected = new Article(4L, title, content);

    // 2. 실제 데이터 획득하기
    Article article = articleService.create(dto);

    // 3. 예상 데이터와 실제 데이터 비교 검증하기
    assertEquals(expected.toString(), article.toString());
}

 

 create_실패() 메서드는 사용자가 새 게시물을 생성할 때 id를 작성할 필요가 없는데도 id를 입력한 상황이다. 게시글을 생성할 때 id를 넣으면 오류가 나고 null이 반환되야 하므로 expected 객체에 null을 저장한다.

 

@Transactional
@Test
void create_실패_id가_포함된_dto_입력() {

    // 1. 예상 데이터 작성하기
    Long id = 4L;
    String title = "라라라라";
    String content = "4444";
    ArticleForm dto = new ArticleForm(id, title, content);
    Article expected = null;

    // 2. 실제 데이터 획득하기
    Article article = articleService.create(dto);

    // 3. 예상 데이터와 실제 데이터 비교 검증하기
    assertEquals(expected, article);
}

 

 

 

 

 

· @Transactional

 

 데이터를 조회하는 테스트를 제외하고 데이터를 생성(Create), 수정(Update), 삭제(Delete)하는 테스트를 할 때는 반드시 해당 테스트를 트랜잭션으로 묶어 테스트가 종료한 후 원래대로 돌아갈 수 있게 롤백 처리해 줘야 한다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.