[Spring] 테스트코드 일지1

백승호·2022년 8월 9일
0

테스트 케이스 공부하면서 배운 점 두서 없이 정리하기

  1. @SpringBootTest 어노테이션을 통해 db에 접근하여 테스트 가능
  2. 그러나 테스트 용도 데이터가 db에 남으면 말이 안됨
  3. @Transactional 어노테이션을 붙여서 기본값으로 롤백기능 지원
  • 롤백 안 하려면 @RollBack 을 false로 지정
  1. db연동 안하고 map 컬렉션을 활용하여 정보 임시 저장 가능
  2. 테스트 코드 클래스를 전체 실행시키면 메소드로 정리된 테스트 케이스들이 전부 실행
  • 이때 유의할 것이 데이터 중복! 메소드 별 하나하나 테스트 시 메소드가 끝나는 시점에서 롤백이 되거나 정보가 사라지지만, 한번에 테스트 케이스를 다 돌릴 시, 기존 자료구조나 db에 정보가 남아 있는 상태로 진행되어 중복과 관련된 에러 발생 가능
  1. 메소드 별로 실행하면 그 해당 메소드만 테스트 실행

오늘은 5번 내용과 관련해서 부연설명 달아놓은 부분을 해결하는 방법을 나누고자 합니다.
(물론 영한님의 지식을 나누는 것 헿)

문제

  • 테스트 케이스 전체 실행 시 데이터가 clear 되지 않아 중복 에러 발생 가능

예시

@Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("seungho");

        Member member2 = new Member();
        member2.setName("yujin");

        memberRepository.save(member1);
        memberRepository.save(member2);

        Member result1 = memberRepository.findByName(member1.getName()).get();
        Member result2 = memberRepository.findByName(member2.getName()).get();

        Assertions.assertThat(member1).isEqualTo(result1);
        Assertions.assertThat(member2).isEqualTo(result2);
        Assertions.assertThat(member1.getName()).isEqualTo(result1.getName());

    }
    
    @Test
    public void findAll(){
        Member member1 = new Member();
        Member member2 = new Member();
        Member member3 = new Member();

        member1.setName("seungho");
        member2.setName("yujin");
        member3.setName("dongdong");

        memberRepository.save((member1));
        memberRepository.save((member2));
        memberRepository.save((member3));

        List<Member> results = (List<Member>)memberRepository.findAll();

        Assertions.assertThat(results.size()).isEqualTo(3);
        Member testMember = results.stream().
                filter(member -> member.getName().
                        equals("yujin")).findAny().get();

        Assertions.assertThat(testMember.getName()).isEqualTo("yujin");


    }

위의 findByName() 과 아래의 findAll()에서 테스트로 넣은 name데이터가 겹치는 것이 있습니다.

그로 인한 결과는

이렇게 기댓값과 실제값이 다르다는 에러를 뿜습니다.
데이터 중복으로 어떤 놈을 불러야 하는지 스프링도 헷갈리는 것이죠.

해결

매 테스트 케이스가 끝날 때마다 데이터를 초기화 시켜주면 되지 않을까?
넵 그럼 됩니다.

생각보다 간단했습니다.

@AfterEach 어노테이션을 활용하면 테스트 케이스 하나하나가 끝날 때마다 개발자가 의도한 내용을 실행시켜주게끔 할 수 있습니다.


1.인터페이스에 추가(물론 repository라는 일관성에 맞지 않는다고 생각하면 다른 클래스에 작성해도 무방)👇

2.구현하는 클래스에서 map 함수인 clear 사용👇

3.@AfterEach를 구현하여 테스트케이스 끝날 때 마다 정보 초기화 진행👇

이렇게 하면 맘 편히 중복되는 데이터를 넣어도 에러가 나지 않고 테스트 진행 가능하게 됩니다!

참고

스프링 입문-코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

profile
처음처럼

0개의 댓글