[java] JUnit을 이용한 데이터베이스 롤백 테스트

이 글에서는 JUnit을 사용하여 데이터베이스 롤백 테스트를 수행하는 방법을 알아보겠습니다. 데이터베이스 롤백 테스트는 테스트 중에 발생한 변경 사항들을 롤백하여 테스트 이전의 상태로 복구하는 것을 목적으로 합니다. 이를 통해 데이터베이스 상태에 영향을 줄 수 있는 테스트를 안전하게 수행할 수 있습니다.

Dependencies 설정

먼저, Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가해야 합니다.

<dependencies>
    <!-- JUnit 4 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!-- H2 Database -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
        <scope>test</scope>
    </dependency>
</dependencies>

JUnit 의존성은 테스트를 작성하고 실행하는 데 필요하며, H2 Database 의존성은 테스트용 임베디드 데이터베이스로 사용됩니다.

롤백 테스트 작성

다음은 롤백 테스트를 작성하는 방법입니다.

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

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import static org.junit.Assert.assertEquals;

public class DatabaseRollbackTest {

    private Connection connection;

    @Before
    public void setUp() throws SQLException {
        // 데이터베이스 연결 설정
        connection = DriverManager.getConnection("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", "", "");
        
        // 테스트용 테이블 생성
        try (Statement statement = connection.createStatement()) {
            String sql = "CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(255))";
            statement.executeUpdate(sql);
        }
    }

    @After
    public void tearDown() throws SQLException {
        // 테스트용 테이블 삭제
        try (Statement statement = connection.createStatement()) {
            String sql = "DROP TABLE test_table";
            statement.executeUpdate(sql);
        }

        // 데이터베이스 연결 종료
        connection.close();
    }

    @Test
    public void testInsertData() throws SQLException {
        // 데이터 삽입
        try (Statement statement = connection.createStatement()) {
            String sql = "INSERT INTO test_table (id, name) VALUES (1, 'Test')";
            int result = statement.executeUpdate(sql);
            assertEquals(1, result);
        }
    }

    @Test
    public void testSelectData() throws SQLException {
        // 데이터 조회
        try (Statement statement = connection.createStatement()) {
            String sql = "SELECT * FROM test_table WHERE id = 1";
            boolean hasResult = statement.executeQuery(sql).next();
            assertEquals(true, hasResult);
        }
    }
}

위 코드에서는 JUnit의 @Before 어노테이션을 사용하여 각 테스트 메소드 실행 전에 데이터베이스 연결 설정과 테스트용 테이블 생성을 수행합니다. 마찬가지로, @After 어노테이션을 사용하여 각 테스트 메소드 실행 후에 데이터베이스 테이블 삭제와 연결 종료를 수행합니다.

@Test 어노테이션은 각 테스트를 정의하는 메소드에 사용되며, 여기서는 testInsertDatatestSelectData 테스트 메소드를 정의했습니다.

테스트 실행 및 롤백 확인

JUnit으로 작성한 테스트를 실행하면 데이터베이스 상태가 테스트 이전의 상태로 롤백되는 것을 확인할 수 있습니다. 아래는 JUnit 테스트를 실행하는 예시입니다.

@RunWith(JUnit4.class)
public class DatabaseRollbackTestRunner {
    public static void main(String[] args) {
        Result result = JUnitCore.runClasses(DatabaseRollbackTest.class);
        
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }

        System.out.println("Test result: " + result.wasSuccessful());
    }
}

또는 IntelliJ IDEA와 같은 개발환경에서는 테스트 클래스를 우클릭하여 “Run ‘DatabaseRollbackTest’“를 선택하여 실행할 수도 있습니다.

위의 예제에서는 testInsertData 메소드에서 데이터를 삽입하고, testSelectData 메소드에서 해당 데이터를 조회합니다. 테스트 비즈니스 로직이 정상적으로 동작하면 assertEquals 메소드에서 예상값과 실제값이 일치하여 테스트가 성공하는 것을 확인할 수 있습니다.

이로써 JUnit과 데이터베이스 롤백 테스트에 대한 기본적인 내용을 알아보았습니다. 데이터베이스 상태에 영향을 줄 수 있는 테스트를 안전하게 수행하고, 테스트 이전의 상태로 롤백하여 일관성 있는 테스트를 할 수 있습니다.

참고 자료