'단위테스트'에 해당되는 글 1건

JUnit은 테스트를 쉽게 작성하고 실행하도록 도와주는 기능을 다수 제공한다.


- 부작용 예방을 위한 테스트별 독립 테스트 클래스 인스턴스와 클래스 로더

- 자원 초기화와 회수를 위한 JUnit 애노테이션

* @Before, @BeforeClass, @After, @AfterClass

- 테스트 결과 확인을 도와주는 다양한 assert 메서드

- 유명 툴과 IDE의 통합 : Ant, Maven, Eclipse, NetBeans, IntelliJ, JBuilder 등

package testCase;

import static org.junit.Assert.*;
import org.junit.Test;
import calculator.Calculator;

public class CalculatorTest {								
	@Test	
	public void testAdd() {		
		Calculator calculator = new Calculator();		
		double result = calculator.add(10, 50);		
		assertEquals(60, result, 0);
	}	
}

테스트 실행은 CalculatorTest파일을 클릭하고 오른쪽버튼 Run-As / JUnit Test를 실행하면 테스트가 실행된다.

테스트 클래스가 되는 조건은 두 가지인데 일단 public 클래스여야 하고, 파라미터를 받지 않는 생성자를 제공해야 한다. 일반적으로 Test로 끝나는 이름을 사용한다. 한 가지 JUnit 3에서는 TestCase를 상속받아야 했지만, JUnit 4에 와서는 이 제약이 사라졌다.

테스트 메서드가 되기 위한 조건은 좀 더 많다. @Test 애노테이션이 부여되어 있어야 하고, public이고, 파라미터도 받아서는 안된다. 마지막으로 반환형은 void여야 한다. 일반적으로 테스트 메서드 이름은 test** 패턴을 따른다. 정적 임포트(static import)한 assertEquals 메서드를 호출해 테스트 결과를 확인하였다.

JUnit은 각 @Test 메서드를 호출할 때마다 테스트 클래스의 인스턴스를 새로 생성한다. 테스트 메서드들을 독립된 공간에서 실행시킴으로써, 혹시 모를 의도치 않은 부작용을 방지하기 위함이다. 모든 테스트 메서드는 각기 다른 테스트 클래스 인스턴스에서 실행되므로, 인스턴스 변수는 공유될 수 없다.

파라미터 두 개를 받는 assert 메서드 항상 같은 패턴을 따른다. 첫 번째 파라미터는 예상값을, 두 번째 파라미터는 실제 값을 의미한다.

여러 개의 테스트 클래스를 동시에 실행해야 할 때는, 테스트 스위트라 불리는 또 다른 객체를 생성한다. 테스트 스위트는 특수한 형태의 테스트 러너로, 테스트 클래스와 똑같은 방식으로 실행할 수 있다.

JUnit 핵심 객체


JUnit 개념

역할

Assert

테스트 하려는 조건을 명시한다. assert 메서드는 조건이 만족되면 그냥 지나가지만 만족되지 못하면 예외를 던진다.

Test

@Test 애노테이션이 부여된 메서드로, 하나의 테스트를 뜻한다. JUnit 먼저 메서드를 포함하는 클래스의 인스턴스를 만들고, 애노테이션된 메서드를 찾아 호출한다.

Test Class

@Test 메서드를 포함한 클래스이다. 

Suite

스위트는 여러 테스트 클래스를 하나로 묶는 수단을 제공한다.

Runner

러너는 테스트를 실행시킨다. JUnit 4는 하위 호환성을 유지하여, JUnit 3의 테스트도 실행가능하다.


파라미터화 테스트 실행하기

package testCase;
 
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import calculator.Calculator;
 
@RunWith(Parameterized.class)
public class ParameterizedTest {    
	private double expected;    
    private double valueOne;    
    private double valueTwo;        
     
    @Parameters
    public static Collection getTestParameters() {      
        return Arrays.asList(new Integer[][] {              
                { 2, 1, 1 },                        
                { 3, 2, 1 },                
                { 4, 3, 1 }     
        }); 
    }       
     
    public ParameterizedTest(double expected, double valueOne, double valueTwo) {       
        this.expected = expected;       
        this.valueOne = valueOne;       
        this.valueTwo = valueTwo;   
    }       
     
    @Test  
    public void testAdd() {     
        Calculator calculator = new Calculator();       
        assertEquals(expected, calculator.add(valueOne, valueTwo), 0);  
    }
}

파라미터화 테스트 러너를 사용하려면 몇 가지 조건을 만족시켜야 한다.

1. 테스트 클래스에는 반드시 @RunWith 애노테이션 부여
2. 테스트에 사용할 인스턴스 선언필요
3. @Parameters라 표시된 메서드 필요

* 반드시 public static java.util.Collection이어야 하며, 어떠한 파라미터도 입력 받아서는 안되고, Collection의 원소는 배열이고 길이는 모두 같아야한다. 그 길이는 유일한 public 생성자와 파라미터 수가 일치해야 한다.

테스트의 반복 횟수는 @Parameters 메서드가 반환하는 컬렉션의 크기에 의해 결정된다. 즉 이 테스트 케이스를 한 번만 실행하면, 아래처럼 매번 다른 값으로 testAdd 메서드를 세번 호출한 것과 동일한 효과를 갖는다.

testAdd: assertEquals(2, calculator.add(1, 1), 0);
testAdd: assertEquals(3, calculator.add(2, 1), 0);
testAdd: assertEquals(4, calculator.add(3, 1), 0);
JUnit은 먼저 정적 메서드인 getTestParameters를 호출해 컬렉션 객체를 얻는다. 다음으로 컬렉션에 저장된 배열의 수만큼 순환하면서 JUnit은 유일한 public 생성자를 찾는다. 이때 만약 public 생성자가 2개 이상이라면 AssertionError를 던진다. 찾은 생성자에 배열의 원소를 파라미터로 넣어 호출한다. 마지막으로 @Test 메서드를 호출한다.


스위트를 이용한 테스트 조직

스위트는 테스트를 담는 그릇으로, 여러 테스트를 묶어 한 번에 실행할 목적으로 사용된다. JUnit 스위트는 하나 이상의 테스트 케이스를 실행하도록 설계되었다. 테스트 러너가 스위트를 실행시키면, 어떤 테스트 케이스를 실행할지는 전적으로 스위트가 결정한다. 사용자가 스위트를 따로 제공하지 않으면 테스트 러너가 자동으로 하나를 만든다.
기본 스위트는 포함된 테스트 클래스들을 살펴 @Test가 부여된 모든 메서드를 찾아낸다. @Test 메서드별로 하나씩 테스트 클래스의 인스턴스를 생성하는 일이 바로 이 스위트 안에서 이루어진다. JUnit은 모든 @Test 메서드를 차례로 실행시키되, 서로 독립적으로 실행시켜 잠재적인 부작용을 예방한다.

package testCase;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({	
	ParameterizedTest.class,	
	CalculatorTest.class
})

public class AllTests {
	
}

JUnit은 스위트의 스위트도 만들 수 있게 설계되어있다. 여러 파일의 스위트를 만들고 최종적으로 하나의 마스터 스위트를 통해 테스트를 할 수가 있다.

package testCase;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({	
	AllTests.class
})

public class MasterTestSuite {
	
}
[ 출저 ] - JUnit in Action 2장


블로그 이미지

행복그리고..

,