본문 바로가기

Spring

04_단위테스트

04_단위 테스트.txt

 

단위테스트 (Unit Test)

 

하나의 기능(메서드)이 제대로 동작하는지 보기 위한 가장 작은 단위의 테스트

어떤 기능(메서드)를 실행했을 때 기대하던 값이 잘 나오는지 체크하는 방식으로 진행

★★테스트는 무조건 public void 메소드여야 함!

 

JUnit 

자바의 단위 테스트용 라이브러리

프로젝트 배포시 작성 돼 있는 모든 단위 테스트를 통과해야 배포가 진행된다. 

 

 

 

JUnit의 어노테이션들

 

@Test

해당 메서드가 단위 테스트 메서드임을 표시한다. 

@Ignore

해당 테스트 메서드를 생략(무시)하고 단위테스트를 진행하도록 만든다. 

 

@Before

테스트 시작 전 실행되는 메서드

@After

테스트 종료 후 실행되는 메서드 

 

 

 

JUnit Asserts

assert메서드로 나오는 결과는 테스트 실행 시 JUnit Test결과 창에 표시되는 bar의 색깔을 결정

기대하던 값과 일치하는 결과가 나오면 에 초록bar를 표시되고 

기대하던 값과 다른 결과가 나오면 붉은 bar가 표시된다.  

 

assertEquals(기대값, 실제값) : 기대값과 실제값이 일치하면 테스트 통과 (초록바) 

assertTrue : 결과가 true면 테스트 통과

assertFalse : 결과가 false면 테스트 통과

assertNull : 결과가 null이면 테스트 통과

assertNotNull : 결과가 null이 아니면 테스트 통과

assertThrows : 예외가 발생하면 테스트 통과

fail : fail()을 만나면 해당 테스트는 무조건 실패

 

 

파란불
빨간불

 

 

 


 

 

JUnit 테스트 실행 예시

 

 

 

테스트 대상 클래스와 테스트 케이스의 패키지 경로를 일치시킬 것

 

 

 

 

 

Calculator.java

 

package com.ezen.util;

public class Calculator {
	
    public int add(int a, int b) {
		return a + b;
	}
	
	public int randomInt(int size) {
		return (int)(Math.random() * size);
	}
	
	//문제1. 짝수인 양의 정수를 생성하여 반환하는 메서드
	public int getEven() {
		int num = (int)(Math.random() * 101);
		return num % 2 == 0 ? num : num + 1; 
	}

	//문제2. 어떤 숫자를 하나 전달하면 소수인지 아닌지 판별해주는 메서드
	public boolean isPrime(int num) {
		if(num < 2) {
			return false;
		}
		//num의 제곱근까지만 돌려도 소수인지 아닌지 알 수 있음
		double sqrt = Math.sqrt(num);
		for(int i =2; i <= sqrt; ++i) {
			if(num % i == 0) {
				return false;
			}
		}
		return true;
	}	
}

 

 

 

 

CalculatorTest.java

 

package com.ezen.util;

//이렇게 JUnit 테스트 어노테이션과 assert마다 임포트 해줘야 됨
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class CalculatorTest {

	//인스턴스 생성
	//★다른 폴더지만 같은 패키지(com.ezen.util)므로 임포트가 필요 없음.
	Calculator calc = new Calculator();

	int a, b;
    
    //테스트 실행횟수를 세고 싶다면 이렇게 하셈
	static int i;
    
	
    //★★테스트는 무조건 public void여야 함!
    
	@Before //테스트 전에 a와 b의 값을 할당하게 됨
	public void before() {
		System.out.println("Execute @Before (" + ++i + ")");//i가 static이라야 증가하네
		a= 10; 
		b= 20;
	}
	
	@After
	public void After() {
		System.out.println("Execute @After (" + ++i + ")");
	} 

	@Ignore
	@Test 
	public void test() {
		int result = calc.add(a, b);
		assertEquals(30, result);
	}
	
	@Ignore
	@Test  
	public void randomTest1() {
		for(int i = a; i < b; ++i) {
			assertTrue(calc.randomInt(i) < i - 1);
		}
	}
	
	
	//문제 1. 짝수인 양의 정수를 생성하여 반환하는 getEven()에 대한 테스트
	
    public void getEvenTest1() { //짝수인지 확인
		int num = calc.getEven();
		assertTrue(num%2==0);
	}
	//이렇게 다방면으로 테스트 해주면 좋음 
	public void getEvenTest2() { //홀수가 아닌지 확인
		int num = calc.getEven();
		assertFalse((num%2==1));
	}
	
    
    
    //ArrayList는 자바 1.7 이상부터 되는데 지금 1.6버전이라 어레리 없음
	//pom.xml 가서 자바 버전 1.8 로 고치고 메이븐 플젝 업데이트 해주기
	public void getEvenTest3() { //랜덤 생성된 짝수 중에 0이 존재하는지
		ArrayList<Integer> evens = new ArrayList<>();
		for(int i = 0; i < 20000; ++i) {
			evens.add(calc.getEven());
		}
		assertTrue("evens에 0이 발견됐습니다.", evens.contains(0));
		//이렇게 메시지를 달아놓으면 테스트 실패시 메시지가 뜸		
	}
	
	
	
	//문제 2. 소수인지 아닌지 판별해주는 메서드에 대한 테스트
	
	public void isPrimeTest1() { //소수 집어넣어서 테스트
		assertTrue(calc.isPrime(13));
	}
	
	public void isPrimeTest2() { //소수 아닌 것 집어넣어서 테스트
		assertFalse(calc.isPrime(14));
	}
    
	
	public void isPrimeTest3() { //1에 대한 테스트
        assertFalse("1을 소수로 판별함", calc.isPrime(1));
        //1은 소수가 아니니까 assertFalase에 초록불이 떠야 하는데 
        //그렇지 않을때 빨간불과 함께 에러메시지가 뜸
	}
    
	public void isPrimeTest4() { //음수일 때도 false 나와야 됨
		assertTrue("-7을 소수로 판별함", calc.isPrime(-7));
	}	
}