[JUnit] 테스트 코드 작성해보기

chrkb1569·2023년 1월 26일
0

JUnit5

목록 보기
2/6

지난번에는 오류로 인하여 불가피하게 테스트 코드 작성을 못해보았으나, 어떻게 해결하게 되어서 오늘 테스트 코드를 작성해보면서 테스트란 어떤 것인지 확인해보려고합니다.

Repository 테스트

일단 간단하게 Repository에서 제공하는 메소드를 테스트해보겠습니다.

save 테스트

테스트는 3가지 단계로 구성된다고합니다.

1) given 2) when 3) then

given의 경우에는 데이터가 주어졌을경우,
when의 경우에는 데이터를 통하여 테스트하고자하는 메소드를 실행하였을 경우
then의 경우에는 실행한 결과를 통하여 증명하는 경우라고 이해하면 될 것 같습니다.

    @Test
    public void saveTest() {
        //given - 데이터가 주어졌을 경우
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        //when - 저장 기능을 테스트하기 위하여 저장 기능 수행
        Book savedBook = bookRepository.save(book);
        
        //then - 저장된 객체와 저장한 객체 비교
        Assertions.assertEquals(book, savedBook);
    }

다음처럼 저장할 객체를 만들기 위한 정보를 만들어주고, save 메소드를 통하여 Repository에 객체를 저장해줍니다.

이때, save() 메소드를 통하여 반환되는 객체를 따로 저장하여 추후에 증명에 사용해줍니다.

마지막으로는 Assertions.assertEquals() 메소드를 사용하여 저장한 객체 book과 저장된 객체 savedBook 객체를 비교하여 테스트를 수행해봅니다.

하하

다음처럼 테스트가 성공함을 확인할 수 있습니다.

그런데 사실 테스트를 처음해보는 입장이라면, JUnit의 성능에 의심이 가기 시작합니다.

정상적으로 작동되는지 한 번 확인해보기 위하여 데이터에 변동을 줘보겠습니다.

@Test
    public void saveTest() {
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        Book savedBook = bookRepository.save(book);
        
        savedBook.setTitle("변경한 도서 제목"); // 데이터 변경

        Assertions.assertEquals(book, savedBook);
    }

다음처럼 저장된 객체의 정보를 수정하는 코드를 추가해주고, 테스트를 진행해보았습니다.

?

이게 아닌데

    @Test
    public void saveTest() {
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        Book savedBook = bookRepository.save(book);

        book.setTitle("수정된 제목");

        Assertions.assertThat(savedBook.getTitle()).isSameAs(book.getTitle());
        Assertions.assertThat(savedBook.getContent()).isSameAs(book.getContent());
        Assertions.assertThat(savedBook.getAuthor()).isSameAs(book.getAuthor());
    }

혹시 객체를 비교하는 과정에서 제 생각대로 메소드가 동작하지 않았을 가능성도 존재하기에, 필드를 하나하나 비교해주는 방식으로 바꿔서 테스트를 진행해보았습니다.

이게 뭐지 진짜

이딴게... 테스트 코드?

@Test
    public void saveTest() {
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        Book savedBook = bookRepository.save(book);

        savedBook.setTitle("수정된 제목");

        System.out.println(book.getTitle());
        System.out.println(book.getContent());
        System.out.println(book.getAuthor());

        System.out.println();

        System.out.println(savedBook.getTitle());
        System.out.println(savedBook.getContent());
        System.out.println(savedBook.getAuthor());
    }

그럼 다 출력해서 확인해봐야죠...ㅎㅎ

예... 참조값을 통하여 메소드를 수행하기 때문에 이렇게 2개가 모두 공유하는 형태인 것 같습니다.

save() 메소드를 통하여 반환하는 객체의 경우, 저장하는 객체와 동일한 참조값을 반환하는것 같네요..

그럼 새로운 객체를 만들어서 참조값을 다르게 해주겠습니다.

@Test
    public void saveTest() {
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        Book savedBook = bookRepository.save(book);

        Book newBook = Book.builder()
                .id(savedBook.getId())
                .title(savedBook.getTitle())
                .content(savedBook.getContent())
                .author(savedBook.getAuthor())
                .build();

        Assertions.assertThat(newBook).isEqualTo(book);
    }

일단 값을 똑같이 설정해준 객체를 통하여 테스트를 수행해봅니다.

테스트가 통과하는 모습을 확인할 수 있습니다.

그렇다면, 이번에는 값을 고의로 변경해주겠습니다.

@Test
    public void saveTest() {
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        Book savedBook = bookRepository.save(book);

        Book newBook = Book.builder()
                .id(savedBook.getId())
                .title(savedBook.getTitle())
                .content(savedBook.getContent())
                .author(savedBook.getAuthor())
                .build();

        newBook.setTitle("수정된 제목");

        Assertions.assertThat(newBook).isEqualTo(book);
    }

다음처럼 테스트가 실패하는 것을 확인할 수 있으며,

다음처럼 로그가 뜨는 것 또한 확인하였습니다.

@Test
    public void saveTest() {
        String title = "테스트 도서 제목";
        String content  = "테스트 도서 내용";
        String author = "테스트 도서 저자";

        Book book = Book.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

        Book savedBook = bookRepository.save(book);

        Book newBook = Book.builder()
                .id(savedBook.getId())
                .title(savedBook.getTitle())
                .content(savedBook.getContent())
                .author(savedBook.getAuthor())
                .build();


        Assertions.assertThat(newBook).isSameAs(book);
    }

다음처럼 isSameAs() 메소드를 통하여 참조값을 통한 비교를 수행할 수 있습니다.


Reference

https://www.youtube.com/watch?v=-fg3ELjxahA&list=PL93mKxaRDidEZfpXoyWZ-2ZLsYrQByDMP&index=7

0개의 댓글