[도구/환경#5] 테스트 자동화 (unittest, pytest)

한줄 요약:
버그를 미리 잡고, 코드의 안정성을 높이기 위해 단위 테스트테스트 자동화를 배우자!
👉 unittestpytest로 테스트 코드 작성, 실행 및 자동화 방법을 익히자.


1. 목표

  • **단위 테스트(unittest)**로 코드 검증하기
  • pytest로 간편한 테스트 작성 및 실행
  • 테스트 자동화로 지속적인 코드 검증 환경 만들기

2. unittest 기본 사용법

1️⃣ unittest 모듈 소개

unittest는 파이썬 내장 테스트 프레임워크로, 단위 테스트를 작성하고 자동으로 실행할 수 있게 해줍니다.
테스트 케이스를 작성할 때 주로 사용하는 TestCase 클래스가 제공됩니다.


2️⃣ unittest 테스트 코드 작성

예시: 간단한 계산기 테스트

import unittest

# 테스트할 코드
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# 테스트 클래스
class TestCalculator(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(-2, -3), -5)

    def test_subtract(self):
        self.assertEqual(subtract(5, 3), 2)
        self.assertEqual(subtract(2, 5), -3)

if __name__ == "__main__":
    unittest.main()

설명:

  • assertEqual(a, b)a와 b가 같으면 테스트 통과, 그렇지 않으면 실패하도록 합니다.
  • 각 테스트 함수는 test_로 시작해야 unittest가 인식합니다.

3️⃣ unittest 실행

테스트 파일이 test_calculator.py라는 이름일 경우, 터미널에서 아래와 같이 실행할 수 있습니다:

python -m unittest test_calculator.py

또는 디렉토리 내 모든 테스트를 실행하려면:

python -m unittest discover

3. pytest 사용법

1️⃣ pytest 설치

pip install pytest

pytestunittest보다 간결하고 강력한 기능을 제공하는 테스트 프레임워크입니다.
assert 구문을 그대로 사용하고, 훨씬 적은 코드로 테스트를 작성할 수 있습니다.


2️⃣ pytest 테스트 코드 작성

예시: 간단한 계산기 테스트

# 테스트할 코드
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# pytest 테스트 함수
def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0
    assert add(-2, -3) == -5

def test_subtract():
    assert subtract(5, 3) == 2
    assert subtract(2, 5) == -3

설명:

  • pytest에서는 assert 문만 사용하여 값을 비교합니다.
  • 테스트 함수는 test_로 시작해야 합니다.

3️⃣ pytest 실행

테스트 파일이 test_calculator.py일 경우, 아래 명령어로 실행합니다:

pytest test_calculator.py

디렉토리 내 모든 테스트를 실행하려면:

pytest

pytest테스트 결과를 더 잘 읽을 수 있도록 출력합니다.


4. 테스트 자동화 및 CI/CD

테스트를 자동화하여 코드를 푸시할 때마다 자동으로 실행되게 만들 수 있습니다.
이를 위해 CI/CD 툴을 사용합니다.

1️⃣ GitHub Actions를 이용한 테스트 자동화

GitHub에서 제공하는 Actions를 사용하면, 코드가 푸시될 때마다 자동으로 테스트가 실행됩니다.

예시: .github/workflows/test.yml 파일

name: Python package

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.9
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run tests
      run: |
        pytest

설명:

  • pushpull_request가 발생할 때마다 GitHub Actions가 자동으로 실행되어, pytest를 실행하고 결과를 GitHub에서 확인할 수 있습니다.

5. 테스트 커버리지

테스트 커버리지는 얼마나 많은 코드가 테스트되고 있는지를 보여주는 지표입니다. pytestcoverage를 이용하여 테스트 커버리지를 확인할 수 있습니다.

1️⃣ coverage 설치

pip install coverage

2️⃣ coverage 실행

coverage run -m pytest
coverage report

또는 HTML 보고서를 생성하려면:

coverage html

6. 자주 묻는 질문(FAQ)

Q. pytestunittest 차이가 무엇인가요?
A. pytestunittest보다 더 간결하고, 추가적인 기능(예: fixture, 파라미터화 등)을 제공하여 테스트 작성이 더 유연합니다. pytestunittest와 호환되어 둘을 함께 사용할 수 있습니다.

Q. assert 구문을 왜 사용하나요?
A. assert는 테스트가 통과하면 아무 일도 일어나지 않으며, 실패하면 바로 오류 메시지를 출력합니다. 예외 처리 없이 직관적으로 비교할 수 있습니다.

Q. 테스트가 실패할 때 더 많은 정보를 보고 싶어요.
A. pytest에서는 -v 옵션을 추가하여 실행하면, 테스트 이름과 결과가 자세히 출력됩니다. 예:

pytest -v

Q. 코드 수정 후에 바로 테스트할 수 있나요?
A. pytest --watch 또는 pytest --maxfail=1 --disable-warnings자동화하면 코드를 수정할 때마다 테스트가 자동으로 실행됩니다.


7. 최종 점검 체크리스트

  • 단위 테스트 작성 및 실행 방법을 이해했다.
  • pytestunittest의 차이를 이해하고, 장점을 비교할 수 있다.
  • CI/CD 도구(GitHub Actions 등)를 사용해 테스트 자동화 설정했다.
  • 테스트 커버리지를 확인하고, 부족한 부분을 채우기 위한 방법을 알고 있다.

8. 요약 한 줄

unittestpytest를 사용해 파이썬 테스트 자동화 환경을 구축하고, CI/CD를 활용하여 코드 안정성을 높이자! ✅


이전 강좌 👈 [도구/환경#4] Docker로 파이썬 개발 환경 컨테이너화
다음 강좌 👉 [도구/환경#6] 파이썬 성능 최적화 (속도 개선 팁)

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.