[java] TestNG에서 예외 처리 및 예외 테스트

TestNG는 자바 기반의 유닛 테스트 프레임워크로써, 예외 처리와 관련된 기능을 제공합니다. 이를 통해 테스트 중에 발생하는 예외 상황을 처리하고, 올바르게 테스트 결과를 검증할 수 있습니다.

1. 예외 처리하기

예외 처리는 @Test 어노테이션의 expectedExceptions 속성을 사용하여 정의할 수 있습니다. 이 속성은 해당 테스트 메소드가 지정된 예외 타입을 던지는 경우에만 테스트를 통과시킵니다.

@Test(expectedExceptions = {CustomException.class})
public void testCustomException() {
    // 예외를 발생시키는 코드
    throw new CustomException();
}

위의 예제에서는 CustomException을 발생시키는 경우에만 테스트를 통과시킵니다. 만약 다른 예외가 발생하는 경우, 테스트는 실패합니다.

2. 예외 메시지 검증하기

예외 발생 시, 발생한 예외의 메시지를 검증할 수도 있습니다. 이를 위해 @Test 어노테이션의 expectedExceptionsMessageRegExp 속성을 사용합니다.

@Test(expectedExceptions = {CustomException.class},
        expectedExceptionsMessageRegExp = "This is a custom exception.")
public void testCustomExceptionWithMessage() {
    // 예외를 발생시키는 코드
    throw new CustomException("This is a custom exception.");
}

위의 예제에서는 CustomException이 발생하고, 그 예외 메시지가 “This is a custom exception.”인 경우에만 테스트를 통과시킵니다.

3. 예외가 발생하지 않는 경우 검증하기

@Test 어노테이션의 expectedExceptions 속성에 org.testng.internal.TestFailedButWithinSuccessPercentageException을 지정하면, 예외가 발생하지 않는 경우에만 테스트를 성공시킬 수 있습니다.

@Test(expectedExceptions = {org.testng.internal.TestFailedButWithinSuccessPercentageException.class})
public void testNoExceptionThrown() {
    // 예외가 발생하지 않는 코드
    // 이 경우에만 테스트를 통과합니다.
}

4. 데이터 프로바이더와 함께 예외 테스트하기

TestNG의 데이터 프로바이더를 활용하면, 예외 처리와 함께 다양한 입력 데이터를 테스트할 수 있습니다.

@DataProvider(name = "inputs")
public Object[][] getInputs() {
    return new Object[][] {
        { 1, 2 },
        { 5, 6 },
        { 10, 0 } // 예외 상황을 가정한 데이터
    };
}

@Test(dataProvider = "inputs", expectedExceptions = {ArithmeticException.class})
public void testDivide(int a, int b) {
    // 예외를 발생시키는 코드
    int result = a / b;
}

위의 예제에서는 testDivide 메소드의 실행 도중 10을 0으로 나누는 경우, ArithmeticException이 발생합니다. 이 경우에만 테스트를 통과합니다.

결론

TestNG를 사용하면 예외 처리와 관련된 다양한 기능을 활용할 수 있습니다. expectedExceptions 속성을 사용하여 예외 타입을 검증하거나, expectedExceptionsMessageRegExp 속성을 사용하여 예외 메시지를 검증할 수 있습니다. 또한 데이터 프로바이더와 함께 사용하면, 다양한 입력 데이터를 테스트하며 예외 상황도 함께 검증할 수 있습니다.