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 기반이라면 굳이 바꿀 필요는 없다.
  • pytestunittest.TestCase 기반의 테스트도 실행할 수 있으므로, 둘을 혼합해서 사용할 수도 있다.
  • 표준 라이브러리만 사용하는 프로젝트라면 unittest를 유지하는 것도 나쁘지 않다.

하지만 새로운 프로젝트를 시작한다면 pytest를 쓰는 것이 더 나은 선택이 될 가능성이 높다.
간결한 문법, 강력한 확장성, 유연한 테스트 실행 방식이 장점이기 때문이다.

결론: unittest만 고집할 필요는 없다

unittest도 여전히 강력한 도구지만, pytest는 더 직관적이고 가독성이 좋은 테스트 프레임워크다.
특히 새로운 프로젝트를 시작하는 경우 pytest를 도입하면 코드를 더 효율적이고 직관적으로 작성할 수 있다.

만약 기존 unittest 기반 프로젝트에서 pytest를 도입하고 싶다면, 점진적으로 적용하면서 비교해보는 것도 좋은 방법이다.
어차피 pytestunittest 코드도 실행할 수 있기 때문에, 조금씩 도입하면서 익숙해지면 된다.

Profile

한창헌

https://github.com/HanChangHun