[Spring] JUnit4 단위 테스트

JUnit4


- 자바용 단위 테스트 API
- 단위 테스트 : 하나의 기능이 올바르게 동장하는지 독립적으로 테스트하는 것
- Spring에 포함되어 있다.

 

JUnit 관련 어노테이션

어노테이션 설명
@Test 이 어노테이션이 붙어있는 메소드를 단위 테스트로 인식하고 실행한다.
여러가지 옵션을 줄 수 있다.
@Ignore 이 어노테이션을 붙인 테스트 메소드를 무시한다. (테스트의 주석 느낌)
@Before 테스트 실행전에 초기화를 진행하는 어노테이션. 테스트 시작 전에 먼저 실행된다.
@After 모든 테스트 종료 후 실행된다.
@RunWith(SpringJUnit4ClassRunner.class) 테스트를 스프링 테스트로 실행하기 위한 설정 (pom.xml에서 spring-test를 추가해야 사용할 수 있다.)
@ContextConfiguration(context.xml 경로) 원하는 context를 로드하여 테스트를 진행할 수 있다.
contextt에 실려있는 bean들을 테스트하기 위한 옵션이다. 

※ src/main을 실행할 때에는 context의 bean를 자동으로 불러와 주지만 test에서 진행할 때에는 contextbean들을 자동으로 불러와주지 않는다. 따라서 context를 꺼내서 테스트를 진행하고 싶다면 bean들이 저장된 context파일을 지정해주어야 그 안에 저장된 값들을 사용할 수 있다.

@Runwith@ContextConfiguration를 같이 사용해야 src/test에서 context를 사용할 수 있다. (@Autowired를 사용할 수 있다.)

 

 

JUnit 테스트 메소드

메소드 기능
assertEquals(30, a+b) 결과 실행시 값이 같으면 테스트 성공 
assertSame(a, b) a와 b가 같은 인스턴스일 때 성공
assertFalse(a) 실행 시 a의 값이 false가 반환되면 테스트 성공
assertTrue(a) 실행 시  a의 값이 true가 반환되면 성공
fail(msg) 이 메서드를 만나면 무조건 실패 

 

테스트 하는 방법


클래스 구조

위와 같은 구조로 main에서 작성된 Prime 클래스를 PrimeTest 클래스에서 테스트 진행


src/main/java에서 간단하게 소수인지 아닌지 판별하는 코드를 작성한 클래스 
클래스는 context.xml에서 bean으로 등록해놓고 사용

@Component
public class Prime {
	public boolean isPrime(int num) {
		return num % 2 == 0 ? true : false;
	}
	public void veryAwesomeFunction(int num) throws ClassNotFoundException {
		if (num > 0) {
			throw new ClassNotFoundException();
		}
	}
}

 

src/main/java에서 작성된 코드를 src/test/java에서 test를 진행

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml")
public class PrimeTest {
	@Autowired
	Prime prime;
	// assertFalse
	@Test
	public void check1() {
		System.out.println(prime);
		assertFalse("1이 소수가 아니라고 나와야 함",prime.isPrime(1));  
	}
	// assertTrue
	@Test
	@Ignore   // 테스트 주석
	public void check3() {
		assertTrue("3이 소수라고 나와야 함 ", prime.isPrime(3));
	}
	// 원하는 예외가 발생해야 통과하는 테스트  (ClassNotFoundException이 나와야함)
	@Test(expected=ClassNotFoundException.class)
	public void expectedTest() throws ClassNotFoundException {
		prime.veryAwesomeFunction(123);
	}
	// 시간 제한 안에 성공해야 하는 테스트 (ms)
	@Test(timeout = 100)
	public void timeoutTest() {
		for(int i=0; i < 100000; i++) {
			System.out.println(i + "번째 출력");
		}
	}
}

 

테스트 실행

 

해당 소스 우클릭 -> Run As -> JUnit Test 실행

 

실행하면 위와같이 결과가 나오는데 성공/실패/스킵 여부를 나타낸다.
실패한 경우  어느부분에서 실패를 했는지 알려준다.  (시간제한안에 성공하지 못한 테스트때문에 실패)

댓글

Designed by JB FACTORY