SpringStudy[test server]

이도환·2023년 9월 10일
post-thumbnail

코드 링크

test server

프로그래밍을 할때 프로젝트는 혼자하는 것보다 협업해서 하는 경우가 훨씬 많다. 그렇게 진행 되다 보면 코드의 길이와 패키지, 파일들의 수가 엄청나게 많아질 수 밖에 없다. 이럴때 testserver없이 프로젝트를 만들면 오류를 찾아가기 힘들고 더욱 복잡해 지기 때문에 testserver는 프로그래밍에서 선택이 아닌 필수조건이 되었다.

요약

테스트 서버를 설명하기 이전에 회원들의 도메인과 레포지토리를 만들어 회원 정보 관리 메소드를 만들어 놓았다.


MemberRepository 인터페이스를 생성하여 메소드들을 추상화 하였다.

package hello.hellospring.repository;
import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

그후 MemoryMemberRepository 클래스를 생성하여 회원들의 정보를 관리하는 메소드들을 만들었다.
MemoryMemberRepository에서 MemberRepository인터페이스를 implements한다.
(마지막에 clearStore()메소드는 테스트 서버를 위해 만든 메소드이기 때문에 잘 기억해두자)

package hello.hellospring.repository;
import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;
    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(),member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public void clearStore(){
        store.clear();
    }
}

테스트 파일 만들기



테스트 파일의 형식은 메인과 같은 구조로 만들며 클래스 명에는 형식 관례에 따라 기존의 클래스명 + Test.java를 붙여 이름을 정한다.

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {
    @AfterEach
    public void afterEach(){
        repostiyory.clearStore();

    }
     MemoryMemberRepository repostiyory = new MemoryMemberRepository();
     @Test
    public void save(){
         Member member = new Member();
         member.setName("jo87");
         repostiyory.save(member);
         Member result = repostiyory.findById(member.getId()).get();
         //Assertions.assertEquals(member, null);
         assertThat(member).isEqualTo(result);
     }
     @Test
     public void findByName(){
         Member member1 = new Member();
         member1.setName("jo88");
         repostiyory.save(member1);
        //member2 shift+f6 단축키 실행시 한번에 변수 바꾸기 가능
         Member member2 = new Member();
         member2.setName("jo89");
         repostiyory.save(member2);
         Member result = repostiyory.findByName("jo88").get();
         assertThat(result).isEqualTo(member1);
     }
     @Test
     public void findAll(){
         Member member1 = new Member();
         member1.setName("jo88");
         repostiyory.save(member1);
         //member2 shift+f6 단축키 실행시 한번에 변수 바꾸기 가능
         Member member2 = new Member();
         member2.setName("jo89");
         repostiyory.save(member2);
         List<Member> result = repostiyory.findAll();
         assertThat(result.size()).isEqualTo(2);
     }

}

이제 코드를 한줄씩 보며 코드를 설명해 보겠다.

  • afterEach 메소드 클래스 전체를 실행할때 메소드 하나가 끝날때마다 데이터를 지워주며 오류를 방지해주는 메소드이다. 이는 import org.junit.jupiter.api.AfterEach;를 가져와 @AfterEach 어노테이션을 사용하여 가져오는 메소드이다.
  • 이제 save()메소드 코드를 보자. Member객체를 만들어 이름을 저장하며 아이디는 메소드에서 자동으로 생성 되도록 만들었기 때문에 코드를 적지 않았다.그 후
    Member result = repostiyory.findById(member.getId()).get();를 통해 result를 가져오고assertThat(member).isEqualTo(result);를 통해 저장이 잘 되었는지를 확인한다.
  • findByName()는 이름 저장후 이름과 result의 동일 여부를 확인하며 테스트한다. 이때 shift+f6 단축키는 해당 변수를 한번에 rename할 수 있기 때문에 기억해두면 편리한 단축키이다.
  • findAll()의 경우 회원을 저장하고 findAll()을 통해 result의 배열 사이즈를 받아오며 제대로 작동되는지 테스트 할 수 있다.

마무리

  • 테스트의 중요성은 양이 늘어난 코드에서 미리 오류를 방지하고 시간을 단축시킬 수 있기 때문에 협업의 프로젝트에서 선택이 아닌 필수이고, 테스트 코드를 작성하는 법을 익히는 습관을 길러야겠다를 느낀 공부였다
profile
개발 블로그

0개의 댓글