스프링 일지

[Spring] 테스트 - JUnit

뉴이네 2023. 11. 16. 13:12

📍테스트

내가 예상하고 의도했던 대로 코드가 정확히 동작하는지 확인하는 작업

→ 애플리케이션을 구성하는 클래스 안에 테스트 코드를 포함시키기 보다 별도로 테스용 클래스를 만들어서 작성하는 편을 더 추천

 

 

 

Given-When-Then 테스트 패턴: 시나리오를 기반으로 테스트하는 패턴
Given  테스트의 상황을 설정 == 테스트 실행 준비
When 특정 동작을 실행 == 테스트 진행
Then 예상 결과를 확인하는 단계 == 테스트 결과 검증

 

 

 

 

📍JUnit 프레임워크의 테스트 조건

  • public 으로 선언
  • @Test 애노테이션

하나의 클래스 안에 여러 개의 테스트 메소드가 들어가는 것을 허용함! (추가 조건)

  • void
  • 파라미터 받지 않기

 

assertEquals() 두 값이 동일한지 확인  /  두 값이 다르면 테스트는 실패
assertTrue() 조건이 참인지 확인  /  조건이 거짓이면 테스트는 실패
assertFalse() 조건이 거짓인지 확인  /  조건이 참이면 테스트는 실패
assertNull() 객체가 null인지 확인  /  객체가 null이 아니면 테스트는 실패
assertNotNull() 객체가 null이 아닌지 확인  /  객체가 null이면 테스트는 실패
assertSame() 두 객체 참조가 동일한 객체를 가리키는지 확인  /  두 객체가 다르면 테스트는 실패
assertNotSame() 두 객체 참조가 다른 객체를 가리키는지 확인  /  두 객체가 같으면 테스트는 실패
assertArrayEquals() 두 배열이 동일한지 확인  /  두 배열이 다르면 테스트는 실패

 

 

 

public class JUnitTest {

    @DisplayName("1+2는 3이다") // 테스트 이름 명시 애너테이션
    @Test
    public void junitTest(){
        int a = 1;
        int b = 2;
        int sum = 3;

        Assertions.assertEquals(sum,a+b);

        assertThat(a+b).isEqualTo(sum);  // 가독성 좋은 코드

    }

}

 

@BeforeAll  전체 테스트를 시작 전에 한 번만 실행 됨

ex. db 연결하거나 테스트 환경 초기화 할 때 사용  -> static으로 선언
@BeforeEach 테스트 케이스를 시작하기 전에 매번 실행

ex. 테스트 메소드에서 사용하는 객체를 초기화하거나 필요한 값을 세팅할때 사용각 인스턴스에 대해 메소드를 호출해야 함으로   static은 안됨
@AfterAll 전체 테스트를 마치고 종료하기 전에 한 번만 실행

ex. db 연결 종료, 자원을 해제할 때 사용전체 주기에서 한 번만 호출되어야 하므로 static 선언
@AfterEach 테스트 케이스를 종료하기 전에 매번 실행

 

 

📍 테스트 순서

 

BeforAll (한번 실행) → 반복 [ BeforeEach → @Test → AfterEach ] ⁠ → AfterAll (한 번 실행)

 

 

 

 

📍 예외발생 케이스 테스트

@Test(expected = 예외 클래스) {

…

}
예외발생해야 성공하는 케이스! (아무 일 없었다면 실패)

@Test(expected = ArithmeticException.class)
public void testDivideByZero() {
    int a = 10;
    int b = 0;
    int result = a / b;  

// 이 코드는 0으로 나누는 것이므로 ArithmeticException을 발생
}

 

 

 

📍 주의사항 

  • 실행순서가 보장되지 않음

    테스트 결과가 순서에 영향을 준다? 잘못된 것
    -> 독립적으로 순서와 상관없이 동일한 결과를 내야함!
  • DB에 남아 있는 데이터와 같은 외부 환경에 영향을 받으면 안됨

 

 

 

 

 

 

 

 

 

아래 관련해서는 따로 작성 후 업로드 예정

  • Before / After는 테스트 메소드에서 직접 호출하지 않기 때문에 서로 주고 받을 정보나 오브젝트가 있다면 인스턴스 변수를 이용해야 한다.
  • 각 테스트 메소드를 실행할 때마다 테스트 클래스의 오브젝트를 새로 만든다는 점