저번 시간에는 Test Code 가
무엇인지 살펴보았으니,
이번 시간에는 java 에서 사용되는
가장 대표적인 테스트 프레임워크인
JUnit 에 대해서 살펴보겠습니다
JUnit 의 핵심 개념
테스트 케이스
JUnit 에서 각 테스트는
테스트 케이스 클래스 내부에 정의되고
보통 테스트할 클래스나 컴포넌트와
동일한 이름으로 작성하며, 테스트 메소드를 포함한다
(JUnit 4 이후부터는 TestCase 를 상속하지 않고, 단순한 Java 클래스로 작성해도 된다)
@Test 어노테이션
JUnit 4 이상을 사용하여 단순한 Java 클래스로 작성할 경우
@Test 어노테이션을 사용하게 된다
해당 어노테이션이 붙은 메소드의 경우, 테스트 메소드로 인식되고 실행된다
Assert
JUnit 에서 assert 문은
테스트 결과를 판단하는 데 사용된다
테스트 메소드 내부에서
예상 결과와 실제 결과를 비교하고
조건에 맞지 않을 경우 테스트는 실패 처리된다
Test Runner
Test Runner 는 JUnit 에서
테스트 메소드를 식별하고 수행하며,
각 테스트의 결과를 모아서 보고한다
(Test Runner 를 수행하기 위한 별도 코드 필요 X)
테스트 스위트(Test Suite)
단일 테스트 클래스 혹은
단일 메소드 외에도
JUnit 은 여러 케이스를 묶어서
한 번에 실행할 수 있는 테스트 스위트를 제공
테스트 메소드 예시
@Test
public void testCode() {
/*
* actual logic for
* testCode
*/
// result
assertEquals(expected, response); // 결과가 같을 경우 테스트 성공
assertSame(expected, response); // 동일한 객체를 참조할 경우 테스트 성공
assertNotSame(expected, response); // 다른 객체를 참조할 경우 테스트 성공
assertTrue(flag); // 참일 경우 테스트 성공
assertFalse(flag); // 거짓일 경우 테스트 성공
assertNull(object); // null 일 경우 테스트 성공
assertNotNull(object); // not null 일 경우 테스트 성공
assertArrayEquals(expectedArray(), responseArray()); // 두 배열이 일치하면 테스트 성공
}
JUnit 의 심화 과정
테스트 픽스쳐
테스트 픽스쳐를 사용하여
테스트 메소드의 실행 환경을
미리 설정하고 정리할 수 있습니다
@Before: 테스트 메소드 실행 전 호출되며, 초기화 작업을 수행
@After: 테스트 메소드 실행 후 호출되며, 정리 작업을 수행
테스트 주기
@Before, @After 어노테이션이
메소드 수준의 작업이었다면
@BeforeClass 와 @AfterClass는
클래스 수준의 초기화, 정리 작업을 수행할 때 사용된다
해당 어노테이션이 붙을 경우,
메소드가 속한 클래스의
모든 테스트 메소드가
실행되기 전 / 후에 한 번만 호출된다
예외 테스트
특정 상황에서 예외가 발생하는지
검증하기 위해서 사용된다
@Test 어노테이션에 'expected' 변수를 추가하여 사용
예외 테스트 메소드 예시
@Test(expected = ArithmeticException.class)
public void testZeroDivision() {
int result = 10 / 0;
}
매개변수화된 테스트
JUnit 4 이후부터는
매개변수화된 테스트를 지원하므로
동일한 테스트 메소드를
다양한 입력값으로 여러 번 실행할 수 있다
(반복적인 테스트 작성 필요 X)
1. 테스트 클래스에 @RunWith(Parameterized.class) 추가
테스트 클래스에 @RunWith 를 추가하여
매개변수화된 테스트를 사용할 것을 선언
2. 매개변수화된 테스트 데이터 정의
테스트 메소드에
@Parameterized.Parameters 를
추가하고, 테스트 데이터들을 정의한다
이때 메소드는 Collection<Object []> 를 반환해야 한다
Object [] 은 테스트로 사용될 값들을 포함한다
이때 메소드를 반드시 static 으로 선언할 것!
3. 매개변수를 받는 생성자 정의
각 데이터에 대한 값을 받는
생성자를 정의해야 한다
매개변수화 된 테스트 데이터와
일치하도록 매개변수를 선언해야 한다
매개변수화된 테스트 예시
@RunWith(Parameterized.class)
public class testParameterized {
private int input1;
private int input2;
private int expected;
private Calculator calculator = new Calculator();
// 생성자
public testParameterized(int input1, int input2, int expected) {
this.input1 = input1;
this.input2 = input2;
this.expected = expected;
}
// 테스트 데이터 정의
@Parameterized.Parameters
public static Collection<Object[]> testData() {
return Arrays.asList(new Object[][] {
{ 2, 3, 5 }, // 2 + 3 =5
{ -1, 2, 1 }, // (-1) + 2 =1
{ 0, 0, 0 }, // 0 + 0 = 0
{ 10, -5, 5 }, // 10 + (-5) = 5
});
}
@Test
public void testAdd() {
assertEquals("값이 일치하지 않습니다.", expected, calculator.add(input1, input2));
}
}
'Web Technologies 🖥️ > java' 카테고리의 다른 글
람다(Lambda)란 무엇인가 (feat... 람다식) - JAVA (1) | 2024.01.21 |
---|---|
제네릭(Generic)을 써보고 싶어요 - JAVA (0) | 2024.01.20 |
List 의 사이즈 및 null 체크를 하고 싶다고? - JAVA (0) | 2023.12.29 |
테스트 코드(JUnit)에서 모의 객체가 필요할 땐? "Mockito" (0) | 2023.12.26 |
equals() 랑 "==" 랑 똑같은 거 아니였어? - JAVA (1) | 2023.12.17 |