전공영역 공부 기록

SRE 백엔드 pytest DB연동 - 작성중

악분 2022. 7. 3. 23:31
반응형

pytest로 테스트 코드를 작성하던 중 DB연동 과정을 소개합니다.

Mock테스트 지양

많은 테스트코드 또는 TDD 책에서 외부와 연결관계 있는 것은 Mock으로 대체할 수도 있다고 설명합니다. 처음에 Mock을 봤을 때는 유레카였는데... 몇주가 지나다보니 Mock을 쓰는건 정말 대안이 없을 때 써야겠다고 생각했습니다.

Mock으로 DB테스트를 하면 테스트 코드를 쉽게 초록불로 표시할 수 있지만, 오히려 테스트하고자 하는 기능을 제대로 테스트를 못할 것 같다고 생각했습니다. 그래서 pytest로 DB연동하는 방법을 찾기 시작했습니다.

DB관리는 어떻게?

가장 쉬운 방법은 테스트용 DB를 별도로 관리하는 것입니다. 테스트 코드를 실행하기 전에 DB를 구축하고 테스트가 끝난 후에 DB를 삭제하는 방법입니다. 하지만, 이 방법은 테스트를 실행할 때마다 DB를 새로 구축해야 되서 매우 관리하기 귀찮습니다.


그래서, 선택하는 방법은 Rollback을 이용하는 방법입니다. 테스트 코드에서 실행한 내용은 rollback해서 DB에 반영하지 않습니다.

음... 현업에서는 어떻게 테스트하는지 잘 모르지만, 이 방법이 올바른 방법인지는 잘 모르겠습니다.


다른 대안은 docker-compose가 있었는데, docker 엔진을 따로 설치해야하고 CI/CD파이프라인에 적용하려면 번거롭다고 생각해서 docker-compose는 제외했습니다.

rollback을 위해 Sql alchemy 아키텍처 공부

파이썬에서는 RDMS와 작업을 할 때, sql alchemy를 쓰는 경우가 많습니다. 저 또한, SRE백엔드에서 sql alchemy를 사용했습니다. 테스트코드에서 sql alchemy rollback을 쓰려면, sql alchmey 아키텍처(하이레벨) 공부가 필요합니다. 적절한 위치에서 rollback을 해야 원하는 결과를 얻을 수 있기 때문입니다. 특히, 테스트 코드를 위한 DB설정을 오버라이딩해야되서 아키텍처 공부가 더 필요합니다.

sql alchemy는 DBAPI를 감싼 구조로 되어 있습니다. DBAPI는 oracle, postgresql등 다양한 DB에 작업을 하기 위해 인터페이스를 가지고 있습니다. 사용자 입장에서는 DB가 어떤 종류든 동일한 함수로 작업할 수 있습니다. 그리고 sql alchemy는 DBAPI를 한번 감싸서 많은 기능과 쉽게 사용할 수 있게 합니다.

출처:https://docs.sqlalchemy.org/en/14/intro.html


따라서, sql alchemy를 사용한다면 DBAPI를 사용하기 위한 engine을 먼저 만들어야 합니다. engine을 만들면 아직 DB와 connection이 맺어지지 않습니다.

하이레벨 수준에서 중간에 DBAPI는 생략하겠습니다. 사실... DBAPI관계도를 그리는 것까지 깊게 이해못했습니다.
from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:')


DB와 연결을 맺으려면 connect함수를 사용하여 객체를 생성해야 합니다. 연결을 맺어야 쿼리를 실행할 수 있습니다.

from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:')
conn = engine.connect()
conn.execute({쿼리})


트랜잭션을 생성해서 commit 또는 rollback도 수행할 수 있습니다.

from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:')
conn = engine.connect()

trans = conn.begin()
conn.execute({쿼리})
trans.commit()


참고자료

공백

반응형