Python 코드 테스트와 디버깅: pytest와 pdb

Python 코드 테스트와 디버깅: pytest와 pdb


1. 서론

코드를 작성할 때 테스트와 디버깅은 중요한 과정입니다. Python에서는 이를 위해 다양한 도구를 제공하며, 그 중에서도 pytest와 pdb는 가장 널리 사용됩니다. 이번 포스팅에서는 pytest를 사용한 코드 테스트와 pdb를 사용한 디버깅 방법을 살펴보겠습니다.


2. pytest 소개 및 기본 사용법


2.1 pytest 설치

pytest는 간단하면서도 강력한 테스트 프레임워크입니다. 설치는 pip를 사용합니다.


pip install pytest

2.2 기본 테스트 작성

pytest를 사용하여 기본적인 테스트를 작성해보겠습니다.


# test_sample.py
def test_addition():
    assert 1 + 1 == 2

def test_subtraction():
    assert 2 - 1 == 1

2.3 어서션 사용

pytest는 다양한 어서션을 사용하여 테스트를 작성할 수 있습니다.


def test_string():
    assert "hello".upper() == "HELLO"
    assert "hello".capitalize() == "Hello"
    assert "hello world".split() == ["hello", "world"]

2.4 테스트 실행

pytest를 사용하여 테스트를 실행합니다.


pytest

3. pytest 고급 기능


3.1 파라미터화 테스트

파라미터화 테스트를 사용하면 여러 입력 값에 대해 동일한 테스트를 실행할 수 있습니다.


import pytest

@pytest.mark.parametrize("input,expected", [
    (1 + 1, 2),
    (2 * 2, 4),
    (3 - 1, 2),
])
def test_operations(input, expected):
    assert input == expected

3.2 테스트 픽스처

테스트 픽스처를 사용하면 테스트 환경을 설정하고 정리할 수 있습니다.


import pytest

@pytest.fixture
def sample_list():
    return [1, 2, 3, 4, 5]

def test_sum(sample_list):
    assert sum(sample_list) == 15

3.3 마크와 필터링

pytest는 마크를 사용하여 테스트를 그룹화하고 필터링할 수 있습니다.


import pytest

@pytest.mark.slow
def test_slow_function():
    import time
    time.sleep(5)
    assert True

@pytest.mark.fast
def test_fast_function():
    assert True

# 특정 마크된 테스트만 실행
# pytest -m slow

4. pdb 소개 및 기본 사용법


4.1 pdb 설치 및 기본 사용법

pdb는 Python의 내장 디버거로, 별도의 설치 없이 사용할 수 있습니다.


4.2 코드에 브레이크포인트 설정

pdb를 사용하여 코드에 브레이크포인트를 설정합니다.


# example.py
def add(a, b):
    return a + b

def main():
    import pdb; pdb.set_trace()
    result = add(1, 2)
    print(result)

if __name__ == "__main__":
    main()

4.3 디버깅 명령어

pdb의 주요 디버깅 명령어를 소개합니다.


  • n(next): 다음 줄로 이동
  • s(step): 함수 내부로 이동
  • c(continue): 다음 브레이크포인트까지 실행
  • q(quit): 디버거 종료

# example.py
def add(a, b):
    return a + b

def main():
    import pdb; pdb.set_trace()
    result = add(1, 2)
    print(result)

if __name__ == "__main__":
    main()

$ python example.py
> example.py(7)main()
-> result = add(1, 2)
(Pdb) n
> example.py(8)main()
-> print(result)
(Pdb) result
3
(Pdb) c
3

5. pytest와 pdb를 함께 사용하기

pytest와 pdb를 함께 사용하여 테스트 중 디버깅을 수행할 수 있습니다.


# test_example.py
def add(a, b):
    return a + b

def test_add():
    import pdb; pdb.set_trace()
    assert add(1, 2) == 3

$ pytest --pdb

6. 실습 예제: 간단한 프로젝트 테스트 및 디버깅


6.1 프로젝트 구조

간단한 프로젝트를 테스트하고 디버깅하는 예제를 만들어보겠습니다.


my_project/
├── example.py
└── tests/
    └── test_example.py

6.2 example.py


# example.py
def add(a, b):
    return a + b

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

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

6.3 test_example.py


# tests/test_example.py
import pytest
from example import add, subtract, multiply, divide

def test_add():
    assert add(1, 2) == 3

def test_subtract():
    assert subtract(2, 1) == 1

def test_multiply():
    assert multiply(2, 3) == 6

def test_divide():
    assert divide(6, 3) == 2

def test_divide_by_zero():
    with pytest.raises(ValueError):
        divide(1, 0)

6.4 테스트 실행 및 디버깅


$ pytest --pdb

7. 결론

pytest와 pdb는 Python 개발자에게 매우 유용한 도구입니다. pytest는 간단한 테스트부터 고급 테스트까지 다양한 기능을 제공하며, pdb는 강력한 디버깅 기능을 통해 코드의 문제를 빠르게 해결할 수 있게 해줍니다. 이 포스팅에서는 pytest와 pdb의 기본 사용법과 고급 기능을 소개하였습니다. 이를 통해 Python 프로젝트의 품질을 향상시킬 수 있습니다.

다음 이전