Pytest 그리고 Unittest

8166 단어 TDDpytestTDD

내가 처음 파이썬 개발을 시작할 때 단위 테스트 프레임워크로 unittest를 주로 사용했었다. 그런데 Github이나 Stackoverflow를 돌아다니다 보면 unittest 보다 pytest를 추천하는 개발자들이 압도적으로 많았다. 이유는 pytest가 unittest에 비해 사용법이 더 편리하고, 파이썬 스타일 가이드(PEP8)를 따라 간결한 코드 작성에 도움이 되며 fixture 활용, custom assert 활용 등의 장점이 있다고 한다.

Pytest vs Unittest

아래처럼 samplecode.py 파일 안에 Calc Class가 있다고 가정해보자.

# samplecode.py
class Calc:

    def __init__(self):
        pass

    def addtion(self, a, b):
        return a + b

    def subtraction(self, a, b):
        return a - b

    def division(self, a, b):
        return a/b

Unittest

위 코드를 테스트 하기 위해서 작성한 Unittest 테스트코드는 다음과 같다.

import unittest

from samplecode import Calc


class CalcTest(unittest.TestCase):
    def setUp(self):
        self.a = Calc()

    def test_addition(self):
        self.assertEqual(self.a.addtion(1,2), 3)

    def test_subtraction(self):
        self.assertEqual(self.a.subtraction(2,1), 1)

    def test_division(self):
        self.assertEqual(self.a.division(4,2), 2)

간단한 테스트 코드라 가독성이 좋아 보이고 단점이 없다고 생각할 수 있지만, Unittest로 작성된 테스트 코드는 다음과 같이 복잡하게 동작한다.

  1. unittest 프레임워크에서 TestCase를 임포트 한다.
  2. TestCase를 상속받는 CalcTest 클래스를 생성한다.
  3. 필요한 테스트케이스를 CalcTest 안에 메서드로 만든다.
  4. 검증을 위해 unittest.TestCase에서 self.assert* 메서드를 사용한다.

Pytest

그럼 이번에는 Pytest로 테스트 코드를 작성해보자.

import pytest

from samplecode import Calc


@pytest.fixture
def calc():
    a = Calc()
    return a


def test_addition(calc):
    assert calc.addtion(1,2) == 3


def test_subtraction(calc):
    assert calc.subtraction(2, 1) == 1


def test_division(calc):
    assert calc.division(4, 2) == 2

Pytest를 사용함으로써 다른 모듈을 임포트 하거나 클래스를 사용하지 않아도 된다. 또한 self.assert* 메서드처럼 무언가를 배우거나 기억하지 않아도 된다.

이 밖에도 Pytest는 장점들이 많이 있다. 내장된 Unittest와도 함께 동작하고 간단한 문법으로 쉽게 시작할 수 있다. 또한 Fixture를 통해 코드의 중복을 줄이고 Fixture들을 하나의 파일에 모아 모든 테스트 코드에서 공유하여 활용하는 것도 가능하다.

앞으로 Pytest에 대해 조금 더 정리해 볼 예정이다.

좋은 웹페이지 즐겨찾기