[파이썬] ORM을 사용한 데이터베이스 테스트 자동화

데이터베이스 테스트 자동화는 소프트웨어의 품질과 안정성을 보장하기 위해 매우 중요합니다. ORM(Object-Relational Mapping)은 데이터베이스와의 상호작용을 추상화하여 개발자가 SQL 쿼리를 작성하지 않고도 데이터베이스를 조작할 수 있는 도구입니다. 이번 포스트에서는 Python에서 ORM을 사용하여 데이터베이스 테스트 자동화를 수행하는 방법에 대해 알아보겠습니다.

1. ORM 라이브러리 선택

Python에서는 다양한 ORM 라이브러리가 있습니다. 가장 많이 사용되는 라이브러리 중 하나는 SQLAlchemy입니다. SQLAlchemy는 SQL 데이터베이스를 위한 ORM이며, 많은 유연성과 확장 가능성을 제공합니다. 또 다른 인기 있는 라이브러리로는 Django ORM과 Peewee가 있습니다.

라이브러리를 선택할 때는 프로젝트의 요구사항을 고려해야 합니다. SQLAlchemy는 복잡한 데이터베이스 작업에 적합하며, Django ORM은 Django 프로젝트에 통합되어 사용하기 쉽습니다. Peewee는 간단한 프로젝트에 적합한 경량화된 ORM입니다.

2. 테스트용 데이터베이스 설정

데이터베이스 테스트를 위해서는 별도의 테스트용 데이터베이스를 설정하는 것이 좋습니다. 이는 프로덕션 데이터베이스와 테스트 데이터베이스를 구분하여 문제를 최소화할 수 있게 합니다.

ORM을 사용하여 테스트용 데이터베이스를 설정하려면, 먼저 ORM 설정 파일에서 데이터베이스 접속 정보를 분리하는 것이 좋습니다. 이는 developmenttesting과 같이 환경 변수를 사용하여 데이터베이스에 접속하는 방식입니다.

# orm_config.py

ENV = 'development'

DATABASES = {
    'development': {
        'host': 'localhost',
        'port': 3306,
        'username': 'dev_user',
        'password': 'dev_password',
        'database': 'development_db',
    },
    'testing': {
        'host': 'localhost',
        'port': 3306,
        'username': 'test_user',
        'password': 'test_password',
        'database': 'testing_db',
    }
}

# main.py

from orm_config import ENV, DATABASES
from sqlalchemy import create_engine

# 데이터베이스 접속 정보 가져오기
db_config = DATABASES[ENV]

# SQLAlchemy 엔진 생성
engine = create_engine(f"mysql://{db_config['username']}:{db_config['password']}@{db_config['host']}:{db_config['port']}/{db_config['database']}")

3. 데이터베이스 모델 정의

ORM을 사용하면 데이터베이스 테이블을 클래스로 정의할 수 있습니다. 이를 통해 객체 지향적인 방식으로 데이터베이스 조작이 가능합니다.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True)
    password = Column(String(50))

4. 테스트 메소드 작성

ORM을 사용하여 데이터베이스를 테스트하는 메소드를 작성합니다. 이를 통해 데이터베이스 조작 및 CRUD(Create, Read, Update, Delete) 작업을 자동화할 수 있습니다.

def test_create_user():
    user = User(username='test_user', password='test_password')
    session.add(user)
    session.commit()
    
    saved_user = session.query(User).filter_by(username='test_user').first()
    assert saved_user is not None
    assert saved_user.username == 'test_user'

def test_update_user():
    user = session.query(User).filter_by(username='test_user').first()
    user.password = 'new_password'
    session.commit()
    
    updated_user = session.query(User).filter_by(username='test_user').first()
    assert updated_user.password == 'new_password'

def test_delete_user():
    user = session.query(User).filter_by(username='test_user').first()
    session.delete(user)
    session.commit()
    
    deleted_user = session.query(User).filter_by(username='test_user').first()
    assert deleted_user is None

5. 테스트 실행

위에서 작성한 테스트 메소드를 실행하여 데이터베이스 테스트를 수행합니다.

from sqlalchemy.orm import sessionmaker

# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()

# 데이터베이스 테스트 실행
test_create_user()
test_update_user()
test_delete_user()

# 세션 종료
session.close()

결론

ORM을 사용하여 데이터베이스 테스트 자동화를 수행하는 것은 데이터베이스 조작을 쉽고 효율적으로 수행하기 위한 좋은 방법입니다. ORM을 사용하면 SQL 쿼리를 작성하는 번거로움을 덜 수 있으며, 테스트 용이성을 향상시킬 수 있습니다. Python에서는 SQLAlchemy, Django ORM 및 Peewee와 같은 다양한 ORM 라이브러리를 사용할 수 있으니, 프로젝트의 요구에 맞게 적절한 라이브러리를 선택하여 업무 효율성을 향상시키세요.