본문 바로가기
Web Technologies 🖥️/java

Java 로 테스트 코드를 작성하시나요? 그렇다면 "JUnit"

by dudefromkorea 2024. 1. 19.

저번 시간에는 Test Code

무엇인지 살펴보았으니,

(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));
    }
}

 

 

728x90
반응형