ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Assertion
    백기선(인프런 강의)/더 자바, 애플리케이션을 테스트하는 다양한 방법 2020. 5. 18. 00:08
    반응형

    Assertion 종류

    assertEqulas(expected, actual) 실제 값이 기대한 값과 같은지 확인
    assertNotNull(actual) 값이 null이 아닌지 확인
    assertTrue(boolean) 다음 조건이 참(true)인지 확인
    assertAll(executables...) 모든 확인 구문 확인
    assertThrows(expectedType, executable) 예외 발생 확인
    assertTimeout(duration, executable) 특정 시간 안에 실행이 완료되는지 확인
    duration - 몇초만에 끝내야하는지

    마지막 매개변수로 Supplier<String> 타입의 인스턴스를 람다 형태로 제공할 수 있다.

    • 복잡한 메시지 생성해야 하는 경우 사용하면 실패한 경우에만 해당 메시지를 만들게 할 수 있다.

    https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html

     

     

    예시 1

    코드구조

     

    마지막 매개변수 String의 매개변수 사용시

    public class Study {
    	private StudyStatus status;
    
    	public StudyStatus getStatus() {
    		return this.status;
    	}
    }
    

     

    @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
    public class StudyTest {
    	@Test
    	@DisplayName("스터디 만들기 \uD83D\uDE31")
    	void create_new_syudy() {
    		Study study = new Study();
    		assertNotNull(study);
    		assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 DRAFT여야 한다.");
    	}
    }
    

     

     

    실패 메세지

     

     

    Supplier<String> 사용 및 람다 사용시

    @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
    public class StudyTest {
    	@Test
    	@DisplayName("스터디 만들기 \uD83D\uDE31")
    	void create_new_syudy() {
    		Study study = new Study();
    		assertNotNull(study);
    		/*
    		assertEquals(StudyStatus.DRAFT, study.getStatus(), new Supplier<String>() {
    			@Override
    			public String get() {
    				return "스터디를 처음 만들면 상태값이 DRAFT여야 한다.";
    			}
    		});
    		*/
    		assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 DRAFT여야 한다.");
    	}
    }

     

    마지막 매개변수로 String과 Supplier<String>(() -> "메세지")의 차이

    마지막에 String 변수가 들어가면 성공하든 실패하든 문자열 연산을 사용하여 표출을 하지만

    람다 표현식을 사용을 하면 문자열 연산을 실패했을 때만 사용한다.

    즉, 람다표현식을 사용하면 유리하다.

     

     

     

    예시2

    assertAll, assertNotNull, assertEquals assertTrue  사용

    @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
    public class StudyTest {
    	@Test
    	@DisplayName("스터디 만들기 \uD83D\uDE31")
    	void create_new_syudy() {
    		Study study = new Study(-30);
    
    		assertAll(() -> assertNotNull(study),
    				() -> assertEquals(StudyStatus.DRAFT, study.getStatus(), 
    						() -> "스터디를 처음 만들면 상태값이 DRAFT여야 한다."),
    				() -> assertTrue(study.getLimit() > 0, 
    						() -> "스터디를 최대 참석 가능인원은 0보다 커야 한다."));
    	}
    }

     

    public class Study {
    	private StudyStatus status = StudyStatus.DRAFT;
    	private int limit;
    	
    	public Study(int limit) {
    		this.limit = limit;
    	}
    	
    	
    	public StudyStatus getStatus() {
    		return this.status;
    	}
    	
    	public int getLimit() {
    		return limit;
    	}
    
    }

     

    public enum StudyStatus {
    	DRAFT, STARTED, ENDED
    }

     

     

    예시3

    assertThrows, assertEquals 사용

    @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
    public class StudyTest {
    	@Test
    	@DisplayName("스터디 만들기 \uD83D\uDE31")
    	void create_new_syudy() {
    		IllegalArgumentException exception =  
    				assertThrows(IllegalArgumentException.class, () -> new Study(-10));
    		String message = exception.getMessage();
    		assertEquals("limit는 0보다 커야 한다.", message);
    	}
    }

     

    public class Study {
    	private StudyStatus status = StudyStatus.DRAFT;
    	private int limit;
    	
    	public Study(int limit) {
    		if(limit < 0) {
    			throw new IllegalArgumentException("limit는 0보다 커야 한다.");
    		}
    		this.limit = limit;
    	}
    	
    	
    	public StudyStatus getStatus() {
    		return this.status;
    	}
    	
    	public int getLimit() {
    		return limit;
    	}
    
    }

     

    예시 4

    assertTimeout

    @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
    public class StudyTest {
    	@Test
    	@DisplayName("스터디 만들기 \uD83D\uDE31")
    	void create_new_syudy() {
    		//성공 예시
    		//assertTimeout(Duration.ofSeconds(10), () -> new Study(10));
    		//실패 예시
    		assertTimeout(Duration.ofMillis(100), () -> {
    			new Study(10);
    			Thread.sleep(300);
    		});
    	}
    }

     

    반응형
Designed by Tistory.