[테크 톡 - 12주차] 단위테스트

728x90

 

 

 

📌 단위 테스트

 

◾ 단위 테스트란?

- 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차이며, 메서드를 테스트하는 또 다른 메서드이다.

- 테스트 대상 단위 크기를 작게 설정해서 단위 테스트를 최대한 간단하고 디버깅하기 쉽게 작성해야 한다.

- Java는 JUnit 으로 테스트 한다.

 

◾ 단위 테스트를 하는 이유

 버그를 줄이고, 코드의 퀄리티를 높이며 문제점 발견, 변경 및 통합이 간단하다.

- 프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하기 때문에 (클래스 또는 메소드 수준) 코드에 문제가 생기는 경우 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다. 

- 테스트를 잘 갖춰 놓으면 단위 테스트 자체가 코드 사용법을 알려주는 문서가 된다.

 

 

◾ 단위 테스트를 하는 방법

👉 필요한 라이브러리 

- JUnit5 : 자바 단위 테스트를 위한 프레임워크

- AssertJ : 자바 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러리

→ JUnit 만으로도 단위 테스트를 작성 할 수 있으나 편의성을 위해 AssertJ 도 함께 쓴다.

 

👉 Given - When - Then 패턴

- Given : 뭔가가 주어져

- When : 실행했을 때 

- Then : 이러한 결과가 나와야 한다.

 

👉 @Test 를 이용하여 메서드 생성 

Class MemberSerViceTest {

	@Test
    void join(){
    	//given
        
        //when
        
        //then
    }

}

- @Test : 해당 메서드가 단위 테스트임을 명시하는 어노테이션 

- 그냥 실행 시 함수 이름이 default로 지정된다.
  이름을 부여 하고 싶다면 @DisplayName 어노테이션을 사용하거나 메서드 이름을 한글로 지정해도된다.
  → 실제 실행되는 코드에서는 여러 오류 발생을 염려해 한글 이름 명명을 잘 하지 않지만 테스트코드는 상관없다고 한다. 

Class MemberSerViceTest {

	@DisplayName("회원가입테스트")
	@Test
    void join(){
    	//given
        
        //when
        
        //then
    }

}
Class MemberSerViceTest {

	@Test
    void 회원가입(){
    	//given
        
        //when
        
        //then
    }

}

 

👉 단위 테스트 작성

참고 게시글

2023.08.16 - [Java/[인프런] Spring 강의] - [인프런] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 #12 - 회원 서비스 테스트

 

[인프런] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 #12 - 회원 서비스 테스트

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard 1. 편하게 Test 생성 하는법 Class 에서 단축키 Ctrl + Shift + T 를 누르면 새 테스트 생성 가능 테

sm-lee2026210.tistory.com

 

    MemberService memberService = new MemberService();
    @Test
    void 회원가입() {
        //given-when-then 문법
 
        //given
        Member member = new Member();
        member.setName("kim");
 
        //when :memberService.join 에 member 객체를 넣어서 검증하여
        // saveId로 리턴 (저장한 ID가 나옴)
        Long saveId = memberService.join(member);
 
        //then
        Member findMember = memberService.findOne(saveId).get();
        Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
 
    }

 

- 메서드 마다 작성을 해 주어야한다.

- 위 코드의 경우 member.setName("Kim"); 을 하여 멤버 이름을 Kim으로 설정하고 ID를 save한다.
 → 아이디를 save 하면 memberID 가 자동으로 생성된다.

- 그랬을 때 동일 memberID가 있는지 확인하는 findMember를 실행하여 set하였던 Name과 find하였던 Name을 비교한다.
  실행 시 오류가 발생하지 않으면  초록불이 나오고 실패 시 빨간 불이 뜬다. 

 

- 오류 내용도 확인이 가능하다. 

 

 

◾ FIRST 규칙

  1. Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
  2. Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.
  3. Repeatable: 어느 환경에서도 반복 가능해야 한다.
  4. Self-Validating: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.
  5. Timely: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.

테스트를 작성 하는 경우 1개의 테스트 함수에 assert를 최소화 하고, 1개의 테스트 함수에는 1가지 개념만 테스트 해야한다.

 

◾ 단위 테스트의 문제점

- 단위 테스트를 통해 버그 없이 잘 돌아간다는 뜻은 아니다. 

- 단위 테스트의 경우 해당 모듈에 대한 독립적인 테스트이기 때문에 다른 객체들과 메세지를 주고받는 경우 문제가 발생한다.
  ( 하나의 메서드가 잘 동작 하더라도 로직에 따라 버그가 있을 수 있다. )

- 위의 경우 다른 테스트 방법을 통해 추가 테스트를 진행해야 한다.

 

 

💌 Reference

- https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/

- https://soozl91.tistory.com/64

- https://imasoftwareengineer.tistory.com/88

- https://mangkyu.tistory.com/143

- https://mangkyu.tistory.com/144

 

728x90