내가 처음 파이썬 개발을 시작할 때 단위 테스트 프레임워크로 unittest를 주로 사용했었다. 그런데 Github이나 Stackoverflow를 돌아다니다 보면 unittest 보다 pytest를 추천하는 개발자들이 압도적으로 많았다. 이유는 pytest가 unittest에 비해 사용법이 더 편리하고, 파이썬 스타일 가이드(PEP8)를 따라 간결한 코드 작성에 도움이 되며 fixture 활용, custom assert 활용 등의 장점이 있다고 한다.
아래처럼 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 테스트코드는 다음과 같다.
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로 작성된 테스트 코드는 다음과 같이 복잡하게 동작한다.
unittest.TestCase
에서 self.assert*
메서드를 사용한다.그럼 이번에는 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에 대해 조금 더 정리해 볼 예정이다.