[파이썬] Psycopg2에서 테스트 및 mocking

테스트는 소프트웨어 개발 과정에서 필수적인 요소입니다. Psycopg2는 Python에서 PostgreSQL 데이터베이스와 상호작용하기 위한 인기 있는 라이브러리입니다. 이 블로그 포스트에서는 Psycopg2를 사용하여 테스트 및 모킹(mocking)을 하는 방법에 대해 알아보겠습니다.

테스트하기 전에

Psycopg2를 사용하여 데이터베이스와 상호작용하는 코드를 작성하기 전에, 아래와 같이 필요한 패키지를 설치해야 합니다.

pip install psycopg2
pip install pytest

단위 테스트(Unit Testing)하기

단위 테스트는 개별적인 코드 조각을 테스트하는 것으로, 소프트웨어 개발 과정에서 중요한 부분입니다. Psycopg2를 사용한 코드를 단위 테스트하기 위해서는 다음 단계를 따르면 됩니다.

  1. 테스트용 데이터베이스를 설정한다.
  2. 필요한 테스트 데이터를 삽입한다.
  3. Psycopg2를 사용하여 데이터베이스와 상호작용하는 코드를 테스트한다.
  4. 테스트 결과를 확인한다.

아래는 예시 코드입니다.

import psycopg2
import pytest

def test_database_interaction():
    # 단위 테스트용 데이터베이스 설정
    conn = psycopg2.connect(
        host="localhost",
        database="test_db",
        user="test_user",
        password="test_password"
    )
    
    # 테스트 데이터 삽입
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE test_table (id SERIAL PRIMARY KEY, name VARCHAR);")
    cursor.execute("INSERT INTO test_table (name) VALUES ('John');")
    conn.commit()

    # Psycopg2를 사용하여 데이터베이스와 상호작용하는 코드 테스트
    cursor.execute("SELECT name FROM test_table WHERE id = 1;")
    result = cursor.fetchone()
    assert result[0] == 'John'

    # 단위 테스트 후 정리
    cursor.execute("DROP TABLE test_table;")
    conn.commit()
    cursor.close()
    conn.close()

위의 코드에서는 test_database_interaction() 함수를 작성하여 Psycopg2를 사용하여 데이터베이스와 상호작용하는 코드를 테스트하고 있습니다. 테스트 결과를 확인하기 위해 assert 문을 사용하였습니다.

Mocking을 사용하여 테스트하기

Psycopg2를 사용하는 코드를 단위 테스트할 때, 데이터베이스에 실제로 연결하여 테스트하는 부분은 테스트의 속도를 늦출 수 있습니다. 이런 경우, Mocking을 사용하여 가짜(mock) 데이터베이스와 상호작용할 수 있습니다.

예를 들어, Mocking을 사용하여 데이터베이스에 연결하는 함수를 가짜(mock) 함수로 대체할 수 있습니다. 이를 위해 pytest-mock 라이브러리를 설치해야 합니다.

pip install pytest-mock

아래는 Mocking을 사용하여 테스트하는 예시 코드입니다.

import pytest
from pytest_mock import mocker
from my_module import my_function

def test_my_function(mocker):
    mocker.patch('psycopg2.connect')  # psycopg2.connect 함수를 mock으로 대체
    
    # 테스트 코드 실행
    my_function()
    
    # Mocking한 함수가 제대로 호출되었는지 확인
    psycopg2.connect.assert_called_once()

위의 코드에서는 mocker.patch 함수를 사용하여 psycopg2.connect 함수를 mock 함수로 대체하였습니다. 그런 다음 my_function이 호출될 때, mock 함수가 제대로 호출되는지 확인하기 위해 assert_called_once()를 사용하였습니다.

마치며

이 블로그 포스트에서는 Psycopg2를 사용하여 테스트 및 Mocking을 어떻게 수행할 수 있는지 알아보았습니다. 테스트를 통해 코드의 신뢰성을 높이고 버그를 최소화하는 데 도움이 됩니다. Mocking은 실제 데이터베이스 연결 없이도 빠르게 테스트를 수행할 수 있는 방법을 제공합니다. Psycopg2를 사용하는 개발자라면 테스트하기 전에 이러한 방법을 고려해 보시기 바랍니다.

Happy coding! 😊