단위 테스트

Eunjeon_g·2023년 9월 8일
0

단위 테스트 : Unit Test

테스트 가능한 가장 작은 SW를 실행하여 예상대로 동작하는지 확인하는 테스트

  • 일반적으로 Class, Method 수준
  • 단위 크기 낮을수록 단위 복잡성 낮아짐

즉, 테스트 대상 단위 크기를 작게 설정하여 간단하고, 디버깅하기 쉽게 작성

1. JAVA에서 단위 테스트 진행하기

  • JUnit5 : java 단위 테스트를 위한 테스팅 프레임워크
  • AssertJ : java 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러로, 에러 메시지와 테스트 코드의 가독성을 높여준다.
1.1. JUnit5와 AssertJ 비교
1) 두 값이 같은지 확인 하는 테스트
	@Test
	void test1() {
		String expected = "java";
		String actual = "java?";
		
		//JUnit5
		//두 값이 같은지 확인
		assertEquals(expected, actual); 
		
		//AssertJ
		assertThat(expected).isEqualTo(expected);
	}
2) str이 null이 아니고, 'Hello'로 시작하고, 'is'가 포함되고, 'ej'로 끝나는지 확인하는 테스트
@Test
	void test2() {
		String str = "Hello My Name is ej";
		
		//JUnt5
		assertNotNull(str);
		assertTrue(str.startsWith("Hello"));
		assertTrue(str.contains("is"));
		assertTrue(str.endsWith("ej"));	
		 
		//AssertJ
		assertThat(str).isNotNull()
					   .startsWith("Hello")
					   .contains("is")
					   .endsWith("ej");
	}

2. 단위 테스트 패턴 : given - when - then

  • given (준비) : 데이터가 준비되었을 때

  • when (실행) : 함수 실행하면

  • then (검증) : 결과가 나와야 함

    1) 다음과 같은 로또 생성기 만들기 : 1000원을 입금하면 로또를 생성해줌
    public class LottoNumberGenerator {
    	 
    	public List<Object> generate(int money){
    		if(!isValidMoney(money)) {
    			throw new RuntimeException("올바른 금액이 아닙니다.");
    		}
    		return generate();
    	}
    
    	//지불 금액이 같은지 확인
    	private boolean isValidMoney(int money) {
    		return money == 1000;
    	}
    	
    	//로또 번호 생성
    	private List<Object> generate(){
    		return new Random()
    				  .ints(1, 45+1)
    				  .distinct()
    				  .limit(6)
    				  .boxed()
    				  .collect(Collectors.toList());
    	}
    }
    
    2) 로또 번호 개수 확인 테스트
    @DisplayName("로또 번호 갯수 테스트")
    	@Test
    	void lottoNumberSizeTest() {
    		//given
    		//로또 생성기 생성 후 1000원 준비
    		final LottoNumberGenerator lottoNumberGenerator = new LottoNumberGenerator();
    		final int price = 1000;
    		
    		//when
    		//1000원 지불
    		final List<Object> lottoNumber =  lottoNumberGenerator.generate(price);
    		
    		//then
    		//로또 개수가 6개인지 확인
    		assertThat(lottoNumber.size()).isEqualTo(6);
    	}

    3. 어노테이션

    @설명
    TestTest Method임을 선언
    DisplayNameTest class or method의 사용자 정의 이름 선언
    Timeout실행 시간 선언, 초과되면 실패하도록
    BeforeEach모든 테스트 실행 전에 실행할 테스트
    AfterEach모든 테스트 실행 후에 실행할 테스트
    BeforeAll현재 클래스 실행 전 제일 먼저 실행할 테스트 (static으로 선언)
    AfterAll현재 클래스 종료 직후 실행할 테스트 (static으로 선언)
    @BeforeEach, @BeforeAll
    : 클래스 내에 존재하는 각각의 @Test 실행 전/후에 매번 실행
    @BeforeAll, @AfterAll
    : 모든 테스트 실행 전/후 딱 한 번만 실행

    출처🙇🏻‍♀️
    단위테스트와 예시
    assertEquals
    Maven에서 AssertJ 사용하기
    Maven - AssertJ Core
    AssertJ와 예시
    @어노테이션
    @BeforeEach와 @BeforeAll의 차이

0개의 댓글