[Spring] (서비스)테스트코드 작성하기

심주흔·2024년 1월 2일
1

springboot3

목록 보기
2/7
post-thumbnail

테스트
: 프로그램의 품질을 검증하는 것으로, 의도대로 프로그램이 잘 동작하는지 확인하는 과정이다.

@SpringBootTest
: 스프링 부트와 해당 클래스를 연동해 테스트할 때 사용하는 어노테이션이다. 테스트 코드에서 스프링 부트가 관리하는 다양한 객체를 주입받을 수 있다.

@Test
해당 메서드가 테스트를 위한 코드라고 선언하는 어노테이션

⚱️ 테스트코드 작성하기

🏺 기본틀

본인 프로젝트의 service 메서드를 검증하는 코드를 만들어보자.

마우스 오른쪽 클릭 -> Generate -> Test 를 선택하면 아래와 같은 창이 생성된다.

여기서 테스트하고자 하는 메서드를 클릭해서 test 파일을 생성해준다.

위와 같이 작성하면 test 코드의 기본 틀을 만든 것이다. ArticleService 클래스를 테스트하기 위해 articleService 객체를 선언하는데 이때 외부 객체를 가져오는 것이기 때문에 @Autowired 어노테이션도 작성한다.

이후 맨 처음 설명했던 어노테이션을 확인한다.

🏺 테스트 코드 동작 순서

테스트를 실행하는 순서는 다음과 같다.

  • 예상 데이터 작성하기
  • 실제 데이터 획득하기
  • 예상 데이터와 실제 데이터 비교하고 검증하기

🏺 테스트 해보기

Service 코드에 있는 index() 메서드

  public List<Article> index() {
        return articleRepository.findAll();
    }

data.sql

테스트 코드

  @Test
    void index() {
        //예상 데이터
        Article a = new Article(1L, "가가가가", "1111");
        Article b = new Article(2L, "나나나나", "2222");
        Article c = new Article(3L, "다다다다", "3333");

        List<Article> expected = new ArrayList<Article>(Arrays.asList(a,b,c));

        //실제 데이터
        List<Article> articles = articleService.index();

        //비교 및 검증
        assertEquals(expected.toString(), articles.toString());
    }

예상 데이터와 실제 데이터를 비교하는 코드이며 사용한 메서드는
assertEquals(x, y)이다.

assertEquals(x, y)
: JUnit에서 제공하는 메서드로 예상 데이터(x)와 실제 데이터(y) 를 문자열로 변환하고 비교하며, 일치하면 테스트를 통과한다.

테스트가 통과되었다는 것을 확인할 수 있다.

또 다른 메서드를 테스트하는 과정은 동일하다. 아래와 같은 오류가 발생하는 것은 test 파일이 이미 존재하는 것을 확인하는 오류이기 때문에 OK를 클릭한다.

🪬 성공사례

@Test

void create_성공() {
//예상 데이터
    String title = "라라라라";
    String content = "4444";

    ArticleForm dto = new ArticleForm(null, title, content);
    Article expected = new Article(4L, title, content);
//실제 데이터
    Article article = articleService.create(dto);
//비교
    assertEquals(expected.toString(), article.toString());
}

예상 데이터는 사용자가 새 데이터를 작성하는 상황으로 가정한다고 했을 때, id는 DB에서 자동으로 생성해주기 때문에, 필요한 title, content만 작성해주면 된다. 이를 dto에 객체로 생성하고, expected에 저장한다.

🪬 실패사례

@Test
void create_실패() {
    Long id = 4L;
    String title = "라라라라";
    String content = "4444";

    ArticleForm dto = new ArticleForm(id, title, content);
    Article expected = null;

    Article article = articleService.create(dto);

    assertEquals(expected, article);
}

실패 상황은 사용자가 새 게시물을 작성할 때, id 값을 생성할 필요가 없는대도, 임의로 생성했다고 가정한 코드이다. 결과는 id를 사용자가 넣으면 null이 반환되기 때문에 expected에 null 값을 저장하는 것이다. null 값은 문자열로 변환할 수 없기 때문에 assertEquals()에는 expected와 article을 반환한다.

⚱️ 트랜잭션 처리

테스트 케이스의 트랜잭션 처리
테스트 시 데이터를 조작(생성/수정/삭제)했다면 테스트를 마치고 데이터를 롤백해야한다. 롤백하기 위해 이전 포스트인 @Transactional 어노테이션을 사용한다.

데이터를 조회하는 테스트를 제외하고는 모두 트랜잭션으로 묶어서 테스트가 종료한 후 원래대로 돌아갈 수 있게 롤백 처리를 해줘야한다.

profile
이봐... 해보기는 했어?

1개의 댓글

comment-user-thumbnail
2024년 1월 2일

백엔드 입문자에게 겁을 주는 게시물이군요

답글 달기