상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - JUnit에서 @Timeout 애너테이션을 사용하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
JUnit에서 @Timeout 애너테이션은 특정 테스트 메서드나 테스트 클래스 전체에 대해 실행 시간 제한을 설정할 때 사용됩니다. 이 애너테이션을 통해 테스트가 지정한 시간 내에 완료되지 않으면 자동으로 실패하도록 할 수 있습니다. 즉, 테스트의 실행 시간이 너무 길어지는 것을 방지하여 테스트 스위트의 효율성을 높이고 무한 루프나 성능 문제를 조기에 발견할 수 있게 도와줍니다. 1. 기본 사용법 `@Timeout` 애너테이션은 JUnit Jupiter (JUnit 5)에서 제공하며, 시간 제한을 초 단위, 밀리초, 분 등으로 설정할 수 있습니다. 테스트 메서드 위에 직접 붙이거나 테스트 클래스 위에 붙여서 해당 클래스 내 모든 테스트에 제한 시간을 적용할 수도 있습니다. 예를 들어, 메서드 단위로 제한 시간을 2초로 설정하려면: ```java import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import java.util.concurrent.TimeUnit; public class TimeoutExampleTest { @Test @Timeout(2) // 기본 단위는 초, 즉 2초 안에 테스트가 완료되어야 함 void testWithTimeout() throws InterruptedException { // 테스트 코드가 2초 이상 걸리면 실패 Thread.sleep(1500); // 1.5초 대기, 테스트 통과 } @Test @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) // 500밀리초 안에 테스트 완료 void testWithTimeoutInMilliseconds() throws InterruptedException { Thread.sleep(600); // 0.6초, 테스트 실패 } } ``` 위 예시에서 첫 번째 테스트는 2초 제한을 주었고, 1.5초만에 끝나므로 성공합니다. 두 번째 테스트는 500ms 제한인데, 600ms 딜레이가 있어서 실패합니다. 2. 클래스 단위 사용 클래스 레벨에 @Timeout 애너테이션을 붙이면 해당 클래스의 모든 테스트 메서드에 동일한 제한 시간이 적용됩니다. ```java import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.Test; import java.util.concurrent.TimeUnit; @Timeout(value = 1, unit = TimeUnit.SECONDS) public class AllTestsTimeout { @Test void fastTest() throws InterruptedException { Thread.sleep(500); // 0.5초, 통과 } @Test void slowTest() throws InterruptedException { Thread.sleep(1500); // 1.5초, 실패 } } ``` 클래스에 1초 제한이 걸렸기 때문에, 1.5초 걸리는 테스트는 실패합니다. 3. 동작 방식과 주의점 - @Timeout은 실제로는 <a href='https://sangseek.com/sangseeks/내부적으로/ko'>내부적으로</a> 테스트 메서드를 별도의 스레드에서 실행시키고, 지정된 시간 안에 실행이 완료되지 않으면 `org.junit.jupiter.api.extension.TimeoutException`을 발생시킵니다. - 제한 시간이 초과되면 해당 테스트는 즉시 실패로 처리됩니다. - 기본 단위는 초(second)이며, `value`와 `unit` 속성 조합으로 세밀한 제어가 가능합니다. - 무한 루프나 오래 걸리는 작업 등 테스트가 멈추지 않는 경우 자동으로 강제 종료되지 않고, 테스트는 실패 상태가 됩니다. - `@Timeout`은 JUnit 4에서는 지원되지 않고, JUnit 5(Jupiter)에서만 지원되므로 JUnit 5를 사용하는 경우에만 적용 가능합니다. 4. 스레드 풀과 @Timeout - 만약 테스트 실행에 활성화된 스레드 풀이 있다면, @Timeout이 내부적으로 사용하는 스레드와 다른 스레드 풀이 혼합되어 있을 수 있으므로, 일부 상황에서는 타임아웃 감지가 예상과 다를 수 있습니다. - 특히 비동기 작업과 함께 사용할 때는 `@Timeout`으로는 부족하여, JUnit의 `assertTimeout()` 같은 메서드를 더 활용할 수도 있습니다. 5. 요약 - `@Timeout`은 테스트 실행 시간을 제한하는 애너테이션 (JUnit 5). - 시간 제한은 초가 기본이며 `value`와 `unit`으로 시간 단위 커스터마이즈 가능. - 메서드 단위 또는 클래스 단위에 적용 가능. - 제한 시간을 초과하면 테스트 실패 처리. - 무한루프 및 장시간 실행 테스트 검출에 유용. --- 위 내용을 참고하여 JUnit 테스트에 `@Timeout`을 적절히 활용하면, 테스트가 예상치 않게 오래 걸리는 문제를 쉽게 관리할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기