• Pytest vs. Unittest

    2021. 7. 3.

    by. Jacob Lee

    728x90

     


     

    장고를 처음 배울 때 테스트 코드를 작성하면서 사용하던 것이 Unittest였다.

    하지만 지금 일하고 있는 회사의 레거시 코드들을 보니 모든 테스트 코드가 Pytest를 사용해서 작성되어 있는 것을 보고 당황했던 것이 기억이 있다.

     

    처음에는 '외국 개발자가 작성한 코드라 그 나라에서는 그렇게 사용하나보다' 정도로만 생각했는데, CI/CD 구축을 위해 테스트 코드 작성을 하려고 검색해보니 Pytest를 Unittest보다 추천하는 개발자들이 압도적으로 많은 것이 확인되었다.

     

    Pytest로 테스트 코드를 작성하기 앞서, '왜 기본으로 내장된 모듈인 Unittest가 아니라 써드파티인 Pytest를 많은 개발자들이 더 선호하고 사용할까?'라는 궁금증이 생겨 알아보기 시작했다.

    (이외에도 Robot, Doctest, Noes2, Tesitfy 등의 파이썬 테스트 프레임워크들이 있다) 

     

    Pytest vs. Unittest

    두 테스트 프레임워크 간의 코드 비교

    그럼 두 테스트 프레임워크는 어떻게 다를까?

    Unittest를 사용했을 때의 코드부터 들여다보자.

    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)

     

    간단한 검증을 하는 테스트 코드라 가독성이 좋아보이고 단점이 없다고 생각이 들 수 있지만, 위의 Unittest 프레임워크로 작성된 테스트 코드는 다음과 같이 복잡한 구조로 작동된다.

    • unittest 프레임워크에서 TestCase 클래스를 임포트 한다.
    • TestCase의 서브 클래스인 TryTesting 클래스를 생성한다.
    • 매 테스트마다 TryTesting 클래스 안에 함수를 작성한다.
    • 검증을 하기 위해 unittest.TestCase에서 self.assert* 함수를 사용한다.

     

    상당히 간단한 테스트 코드인데, 미니멈 한 테스트 코드에도 이 정도 양의 코드를 써주어야 하고, 더 디테일한 테스트 코드를 작성할 땐 반복적인 코드가 반복되어야 한다니, 좋은 방법은 아니라고 생각이 든다.

     

    그럼 같은 코드를 Pytest를 사용한다면 어떻게 될까?

    # test_with_pytest.py
    
    def test_always_passes():
        assert True
    
    def test_always_fails():
        assert False

     

    10줄 정도밖에 안되던 코드마저 7줄로 줄었다. 작을수록 차이가 안 날 수 있는데 30%의 차이는 엄청나다고 생각한다. Pytest를 사용함으로써 어떤 임포트나 클래스를 사용하지 않아도 된다. assert 키워드를 사용하면 되기 때문이다. 즉, self.assert* 함수처럼 무언가를 배우거나 기억하지 않아도 된다는 것이다. 

     

    지금까지의 차이점만 비교해도 Pytest가 Unittest보다 쉽고 더 사용성이 좋다는 것을 느낄 수 있다.

    더 나아가서 Stackshare에서 가져온 다음 이미지에서 볼 수 있듯이, pytest를 사용하는 기업이 약 10배 정도 많은 것을 확인할 수 있다.

     

    Image from stackshare.io

     

    Pytest

    그럼 더 나아가서 Pytest를 왜 사용해야 할까?

    Pytest를 사용하면 다음과 같은 이점이 있다.

    • Pytest는 오픈 소스이다.
    • 내장된 Unittest와도 작동한다.
    • 간단한 문법으로 쉽게 시작할 수 있다.
    • 거대한 커뮤니티 지원
    • 플러그인을 사용함으로써 매우 확장 가능하다.
    • Fixture를 지원한다.

    잠깐만 보아도 Pytest는 장점이 많은, 단연코 파이썬을 위해 제일 좋은 테스트 프레임워크라는 것을 알 수 있다. Pytest에 관한 더 많은 공부는 튜토리얼을 진행하면서 배워보자.

     

    Reference

     

    728x90

    댓글