unittest, 잘 사용하고 있었는데… 요즘은 pytest가 대세?
Python에서 테스트를 작성할 때 가장 기본적인 방법은 unittest
를 사용하는 것이다.
표준 라이브러리라서 별도 설치 없이 사용할 수 있고, 문서도 잘 정리되어 있어서 처음에는 이걸로 충분하다고 생각했다.
그런데 최근 Python 커뮤니티에서 pytest
가 계속 언급되고, 많은 프로젝트들이 pytest
로 전환하는 모습을 보인다.
"이미 unittest
로 충분한데 굳이 바꿀 필요가 있을까?" 싶었지만, 직접 써보니 이유가 있었다.
그래서 이번 글에서는 왜 사람들이 pytest
를 선호하는지, 그리고 진짜 바꿀 필요가 있는지 알아보려고 한다.
unittest: 기본이지만, 다소 불편한 점도 있다
unittest
는 Python 표준 라이브러리에 포함된 공식 테스트 프레임워크다.
다음과 같이 클래스를 정의하고 unittest.TestCase
를 상속받아 테스트를 작성한다.
import unittest
class TestMath(unittest.TestCase):
def test_addition(self):
self.assertEqual(1 + 1, 2)
def test_subtraction(self):
self.assertEqual(5 - 3, 2)
if __name__ == "__main__":
unittest.main()
이 코드를 실행하면 unittest
가 자동으로 테스트를 실행하고 결과를 출력한다.
테스트를 작성할 때 assertEqual
, assertTrue
같은 다양한 assert
메서드를 제공해서 검증할 수 있다.
unittest의 장점
- Python 기본 제공 라이브러리라서 별도 설치가 필요 없음
- 객체지향적으로 테스트를 구성할 수 있음
setUp
,tearDown
같은 메서드를 활용해 테스트 환경을 설정할 수 있음
하지만 단점도 존재한다
- 코드가 길어진다:
self.assertEqual(a, b)
같은 긴 메서드를 계속 써야 해서 가독성이 떨어짐 - 클래스 기반이라 불필요한 구조가 많음: 간단한 테스트에도
TestCase
클래스를 상속해야 함 - 실행 결과가 가독성이 좋지 않음: 실패한 테스트가 어디서 문제가 생겼는지 직관적으로 보기가 어려움
pytest: 더 간결하고 강력한 테스트 프레임워크
pytest
는 Python 생태계에서 가장 널리 사용되는 테스트 프레임워크 중 하나로, unittest
보다 훨씬 간결한 문법과 강력한 기능을 제공한다.
같은 테스트를 pytest
로 작성하면 이렇게 된다.
def test_addition():
assert 1 + 1 == 2
def test_subtraction():
assert 5 - 3 == 2
여기서 중요한 점은 클래스 없이도 테스트를 작성할 수 있고, 그냥 assert
만 쓰면 된다는 것이다.self.assertEqual
같은 긴 메서드를 쓸 필요도 없고, 코드가 훨씬 깔끔해진다.
pytest의 장점
- 불필요한 코드가 없다:
assert
하나로 검증 가능 - 실행 결과가 보기 좋다: 실패한 테스트가 어떤 입력값에서 실패했는지 명확하게 출력됨
- 더 유연하다: 클래스 없이도 테스트가 가능하고, 필요하면
pytest.fixture
를 이용해 쉽게 설정 가능 - 예외 발생 테스트가 간단하다
예를 들어, unittest
에서 예외 발생을 테스트하려면 이렇게 해야 한다.
import unittest
class TestDivide(unittest.TestCase):
def test_divide_by_zero(self):
with self.assertRaises(ZeroDivisionError):
1 / 0
그런데 pytest
에서는 이렇게 한 줄이면 끝난다.
import pytest
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
1 / 0
확실히 코드가 짧아지고, 직관적으로 변했다.
unittest vs pytest: 어떤 것을 선택해야 할까?
비교 항목 | unittest | pytest |
---|---|---|
설치 여부 | 기본 내장 | 추가 설치 필요 (pip install pytest ) |
코드 구조 | 클래스 기반 | 함수 기반 가능 |
어설션 방식 | self.assertEqual(a, b) |
assert a == b |
예외 처리 테스트 | self.assertRaises(Exception, func) |
pytest.raises(Exception) |
확장성 | 기본 기능 위주 | 플러그인 (pytest-xdist 등) 활용 가능 |
가독성 | 다소 길어질 수 있음 | 간결하고 직관적 |
결론적으로 pytest가 전반적으로 더 깔끔하고 편리하다.
그럼 unittest를 버려야 할까?
꼭 그럴 필요는 없다.
- 기존 코드가 이미
unittest
기반이라면 굳이 바꿀 필요는 없다. pytest
는unittest.TestCase
기반의 테스트도 실행할 수 있으므로, 둘을 혼합해서 사용할 수도 있다.- 표준 라이브러리만 사용하는 프로젝트라면
unittest
를 유지하는 것도 나쁘지 않다.
하지만 새로운 프로젝트를 시작한다면 pytest
를 쓰는 것이 더 나은 선택이 될 가능성이 높다.
간결한 문법, 강력한 확장성, 유연한 테스트 실행 방식이 장점이기 때문이다.
결론: unittest만 고집할 필요는 없다
unittest
도 여전히 강력한 도구지만, pytest
는 더 직관적이고 가독성이 좋은 테스트 프레임워크다.
특히 새로운 프로젝트를 시작하는 경우 pytest
를 도입하면 코드를 더 효율적이고 직관적으로 작성할 수 있다.
만약 기존 unittest
기반 프로젝트에서 pytest
를 도입하고 싶다면, 점진적으로 적용하면서 비교해보는 것도 좋은 방법이다.
어차피 pytest
는 unittest
코드도 실행할 수 있기 때문에, 조금씩 도입하면서 익숙해지면 된다.
'컴퓨터 공부 > 파이썬' 카테고리의 다른 글
devpi를 활용한 사설 PyPI 서버 구축 가이드 (0) | 2025.02.14 |
---|---|
pyproject.toml과 Twine을 이용해 PyPI에 올리기 (0) | 2025.02.11 |
setup.py, 잘 사용하고 있었는데… 이제는 권장되지 않는다? (0) | 2025.02.10 |
Python 패키지 관리 도구 uv 소개 (2) | 2025.02.10 |
Python OpenCV VideoWriter가 정상적으로 동작하지 않는 경우 (0) | 2022.10.31 |