[java] JUnit과 테스트 실제 데이터 사용하기

테스트는 소프트웨어 개발 과정에서 매우 중요한 부분입니다. 테스트를 통해 코드의 품질을 확인하고 버그를 찾을 수 있습니다. JUnit은 자바 프로그래밍 언어를 위한 테스트 프레임워크로, 단위 테스트를 작성하고 실행할 수 있는 많은 도구와 기능을 제공합니다.

하지만 JUnit 테스트를 작성할 때 가끔 실제 데이터를 사용해야 할 경우가 있습니다. 모의 객체를 사용하여 가상의 데이터를 생성하기도 하지만, 때로는 실제 데이터를 테스트에 사용하는 것이 더 효과적일 수 있습니다. 이 글에서는 JUnit 테스트에서 실제 데이터를 사용하는 방법을 알아보겠습니다.

1. 테스트용 데이터베이스 생성

테스트에 사용할 실제 데이터를 담은 데이터베이스를 생성해야 합니다. 이를 위해서는 테스트 전용 데이터베이스를 만들거나, 실제 운영 데이터베이스의 복사본을 사용할 수 있습니다.

테스트 전용 데이터베이스를 생성하는 방법은 데이터베이스 종류에 따라 다를 수 있습니다. 일부 데이터베이스 관리 시스템은 데이터베이스를 쉽게 생성 및 삭제할 수 있는 툴을 제공합니다. 이 툴을 사용하여 손쉽게 테스트용 데이터베이스를 생성할 수 있습니다.

실제 운영 데이터베이스의 복사본을 사용하는 경우에는, 데이터베이스의 백업 파일을 만들어 사용할 수 있습니다. 데이터베이스 백업 파일을 테스트용 데이터베이스에 복원한 후에 테스트를 진행하면 됩니다.

2. 테스트에서 데이터베이스 접근하기

JUnit 테스트에서 실제 데이터를 사용하기 위해서는 테스트 메소드에서 데이터베이스에 접근해야 합니다. 데이터베이스 접근은 일반적으로 JDBC를 사용하여 이루어집니다.

아래는 JUnit 테스트에서 데이터베이스에 접근하는 예시 코드입니다.

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import static org.junit.Assert.assertEquals;

public class DatabaseTest {

    @Test
    public void testDatabaseAccess() throws SQLException {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb", "username", "password");
        
        String query = "SELECT COUNT(*) FROM users";
        PreparedStatement statement = conn.prepareStatement(query);
        ResultSet resultSet = statement.executeQuery();
        
        if (resultSet.next()) {
            int count = resultSet.getInt(1);
            assertEquals(3, count); // 예상 결과와 실제 결과 비교
        }
        
        conn.close();
    }
}

위 코드에서는 JDBC를 사용하여 MySQL 데이터베이스에 접근한 후, “users” 테이블의 레코드 개수를 조회하는 테스트를 수행합니다. 테스트 결과로 예상 결과와 실제 결과를 비교합니다.

3. 테스트 후 데이터 정리하기

테스트가 완료된 후에는 사용한 데이터를 정리해야 합니다. 삭제해야 하는 데이터가 있다면 삭제 작업을 수행하거나, 테스트 전용 데이터베이스인 경우 데이터베이스를 삭제해야 합니다.

테스트 후 데이터 정리는 @After 또는 @AfterClass 어노테이션을 사용하여 테스트 메소드 실행 이후에 자동으로 수행될 수 있도록 설정할 수 있습니다.

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

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

public class DatabaseTest {

    @Test
    public void testDatabaseAccess() throws SQLException {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb", "username", "password");

        // ...

        conn.close();
    }
    
    @After
    public void cleanup() throws SQLException {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb", "username", "password");
        
        String query = "DELETE FROM users"; // 테스트 데이터 삭제 쿼리
        PreparedStatement statement = conn.prepareStatement(query);
        statement.executeUpdate();
        
        conn.close();
    }
}

위 코드에서는 @After 어노테이션을 사용하여 테스트 후에 해당 메소드가 실행되도록 설정했습니다. 테스트 후에는 “users” 테이블의 모든 데이터를 삭제하는 쿼리를 실행하여 데이터를 정리합니다.

결론

JUnit을 사용하여 테스트를 작성할 때, 실제 데이터를 사용하면 보다 실제 상황에 가까운 테스트를 할 수 있습니다. 이를 통해 버그를 더 쉽게 찾을 수 있고, 코드의 품질을 높일 수 있습니다. 하지만 실제 데이터를 사용하는 경우에는 데이터 관리에도 신경을 써야 하며, 테스트 후에는 데이터를 정리하는 작업을 꼭 수행해야 합니다.


참고 문서: