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 프로젝트의 품질을 향상시킬 수 있습니다.