들어가며
python을 사용해 프로그래밍을 하다보면, python 버전 설치된 패키지의 버전에 따라 프로그램이 작동하지 않을 수도 있다. 새로운 패키지를 설치해 프로그램을 업데이트 했을 때 프로그램이 동작하지 않는 경우도 있으며, 개발환경에서는 잘 동작하던 프로그램이 배포환경에서는 잘 작동하지 않는 경우도 종종 있다. 이러한 문제를 해결하기 위해서는 여러가지 버전과 패키지의 테스트를 자동화 시켜주는 도구인 tox를 소개하고자 한다.
Tox란 무엇인가?
tox aims to automate and standardize testing in Python. It is part of a larger vision of easing the packaging, testing and release process of Python software.
tox 문서에서는 tox를 위와같이 소개한다. tox는 Python의 자동화되고 표준화된 테스트를 위한 도구이다.
만일 당신이 github에 올라와있는 오픈소스를 내려받고 테스트 코드를 실행시켜 보려면, 애플리케이션을 실행하기 위한 다음과 같은 과정을 거쳐야할 수도 있다.
- 애플리케이션을 위한 환경변수 설정
- 선 수행되어야하는 스크립트 실행
- 호환되는 Python 버전 체크
- 호환되는 운영체제확인 등
tox는 이같은 문제를 해결하기 위해 자동으로 tox.ini에 설정된 가상환경내에서 환경변수, 스크립트 실행, python 버전 등을 자동으로 설정해준다. 이를 통해 개발자는 테스트 과정에서 일일이 각 환경을 수동으로 설정할 필요가 없어진다.
또한, tox는 가상환경 단위로 테스트를 구성하기 때문에, 개발자들은 다른 패키지와의 충돌을 방지하고 테스트의 격리성을 유지할 수 있다.
Tox로 할 수 있는 것들
tox를 사용하면 다음의 것들을 쉽게 수행하고 자동화 할 수 있다.
- 다른 버전의 Python에 대한 테스트
- 다른 종속성 버전에 대한 테스트
- 설정 단계/임시 명령 캡처 및 실행
- 환경 변수 격리
- Windows/macOS/Linux에서 모든 테스트를 수행
- CI/CD 단계에서 설정한 버전/종속성에 대한 테스트를 자동으로 수행하고 린트체크, 커버리지 리포트를 제공
Tox는 어떻게 작동하는가?
위 다이어그램은 tox가 작동하는 방식을 보여준다.
1. 파일에 정의된 Python 버전을 사용해 가상환경(tox.ini)를 생성한다
2. deps 파일 설정 아래 나열된 종속성을 tox.ini 가상환경에 설치한다. 프로젝트가 생성이 된 경우 sdist 프로젝트를 설치한다.
3. 각각의 격리된 가상환경에서 명령을 실행한다. 명령은 명령 설정([command])아래에 작성된다.
4. 각 환경의 결과를 사용자에게 반환한다.
따라해보기
1. 간단한 테스트 코드 작성하기
FastAPI로 hello world를 응답받는 간단한 웹 서비스를 만든다.
1.1 패키지 설치
pip install fastapi uvicorn
1.2 메인 코드 작성
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello, World!"}
@app.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello, {name}!"}
1.3 실행 테스트
uvicorn main:app --reload
브라우저를 열고 http://localhost:8080 에 접속해 "Hello, world!" 메시지를 확인할 수 있다
1.4. 테스트 코드 작성
pytest로 테스트 하기위해 테스트 코드를 작성한다.
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_hello_world():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, World!"}
def test_hello_world_name():
response = client.get("/hello/my_name_is")
assert response.status_code == 200
assert response.json() == {"message" : "Hello, my_name_is!"}
2. tox로 테스트코드를 실행하기 위한 과정
다음은 tox로 테스트를 실행하기 위한 과정이다. tox를 사용하기 위해서를 패키지를 내려받고, tox.ini 파일 그리고 setup.py를 작성해야한다.
2.1 tox 설치
pip install tox
2.2 tox.ini 작성
tox.ini는 tox를 위한 설정 파일이다. 다음과 같이 작성한다
#tox.ini
[tox]
isolated_build = True ; 가상환경별로 독립된 환경을 구성하는 옵션
envlist = py39,py311 ; python3.9, python3.11 버전의 테스트
skipsdist = true
[tox:.package]
basepython = python3 ; 기본 python 버전을 명시
[testenv]
deps=fastapi ; 사용할 의존패키지 목록
pytest
httpx
uvicorn
commands=python -m pytest ; 실행할 명령어
2.3 setup.py 작성
tox를 실행하기위해서는 setup.py를 작성해야한다. 다음과 같이 간단하게 setup을 작성한다.
#setup.py
from setuptools import setup
setup(name='hello_fastapi',
version='0.1')
2.4 tox 테스트
프로젝트의 루트 디렉토리에서 tox를 입력하면 다음과같은 테스트 결과를 얻을 수 있다.
마치며
tox를 활용해 테스트 환경을 설정해 보았다. 아직 많은 기능을 사용해보고 테스트해보지는 않았지만, 오픈소스 프로젝트를 내려받고 테스트 해볼 수 있는 정도의 지식을 갖출 수 있었다. 이 다음으로 테스트를 CI/CD 단계에서 테스트하고 커버리지 레포트까지 만드는 과정을 다음에 실습해보고자 한다.
'Computer Science > Python' 카테고리의 다른 글
[Python] FastAPI와 Dependency Injector (3) | 2024.10.27 |
---|---|
[Python] 비동기 테스트를 하려면? (a.k.a pytest-asyncio) (3) | 2024.04.28 |
[Python] UoW(Unit of Work) 패턴을 알아보자 (0) | 2024.04.14 |
[Python] SqlAlchemy 1.4 -> 2.0 마이그레이션 단계별 가이드 (0) | 2024.03.31 |
[Pythonic Code] 파이썬스러운 코드! (0) | 2022.12.27 |