[Python] 파이썬 Pytest 코드로 테스트하기
in Development on Python
코드 테스트를 하기위해 Pytest에 관해 간단하게 쓰려고한다. 좋은 블로그가 있어서 간단하게만 정리하자.
pytest와 TDD
- pytest란 단하게 말하면 코드테스트 하는거다.
- TDD(Test Driven Development) : 개발이 커지면 오류 잡는데 한세월이다. 본격적인 개발에 들어가기전에 테스트 계획 및 코드 작성을 하는거를 말한다.
Test Code
- 그냥 테스트 하고 싶은 함수에 return 대신 assert쓰고
pytest first_test(파일명).py
라고 커맨드에 치면 알아서 검사해준다.
Structure
- 위의 방법은 하나씩 해야되어서 귀찮다. 디렉토리 하나에 테스트 코드들 다 떄려넣고 한방에 테스트하면 편하지
- tests(디렉토리명)에다가 test코드로 된 py파일 때려넣는다.
python3 -m pytest tests(디렉토리명)
하면 끝
pytest fixtures
- fixture라는 데코레이터(쉽게 말하면 그냥 데코는 함수를 수정하않고 특정동작을 추가하거나 작동방식을 바꿀수있음)을 써서 중복되는 코드를 좀 편하게 쓸수 있게한다.
- 방법은 중복된 클래스 선언을 하나에 fixture 데코레이터가 쌓인 함수에 넣는 방법이다. 말이 어렵다 아래 코드를 보자.
계산기 클래스를 사용한다.
# calculator.py
class Calculator(object):
"""Calculator class"""
def __init__(self):
pass
@staticmethod
def add(a, b):
return a + b
@staticmethod
def subtract(a, b):
return a - b
@staticmethod
def multiply(a, b):
return a * b
@staticmethod
def divide(a, b):
return a / b
테스트를 하려면 아래와 같이 써야된다.
# test_calculator.py
from src.calculator import Calculator
def test_add():
calculator = Calculator()
assert calculator.add(1, 2) == 3
assert calculator.add(2, 2) == 4
def test_subtract():
calculator = Calculator()
assert calculator.subtract(5, 1) == 4
assert calculator.subtract(3, 2) == 1
def test_multiply():
calculator = Calculator()
assert calculator.multiply(2, 2) == 4
assert calculator.multiply(5, 6) == 30
def test_divide():
calculator = Calculator()
assert calculator.divide(8, 2) == 4
assert calculator.divide(9, 3) == 3
class 선언이 겹친다. 아래와 같이 하면된다.
import pytest
from src.calculator import Calculator
@pytest.fixture
def calculator():
calculator = Calculator()
return calculator
def test_add(calculator):
assert calculator.add(1, 2) == 3
assert calculator.add(2, 2) == 4
def test_subtract(calculator):
assert calculator.subtract(5, 1) == 4
assert calculator.subtract(3, 2) == 1
def test_multiply(calculator):
assert calculator.multiply(2, 2) == 4
assert calculator.multiply(5, 6) == 30
conftest
- 만약에 test1.py도 계산기를 쓰고 test2.py도 계산기를 쓰면 위처럼 fixture를 계속 써줄껀가? 그럴필요없다.
- conftest.py 파일을 만들면 된다.
# Directory tree src/ __init__.py calculator.py tests/ conftest.py test_code1.py test_code2.py test_code3.py
아래처럼 conftest.py 파일에다가 fixture 했던 내용을 넣어두면 된다.
# conftest.py
import pytest
from src.calculator import Calculator
@pytest.fixture
def calculator():
calculator = Calculator()
return calculator
그러면 아래처럼 함수안에 fixture function을 파라미터로 사용하면 클래스를 가져올수있다.
# test_code.py
def test_add(calculator):
"""Test functionality of add."""
assert calculator.add(1, 2) == 3
assert calculator.add(2, 2) == 4
assert calculator.add(9, 2) == 11
def test_subtract(calculator):
"""Test functionality of subtract."""
assert calculator.subtract(5, 1) == 4
assert calculator.subtract(3, 2) == 1
assert calculator.subtract(10, 2) == 8
def test_multiply(calculator):
"""Test functionality of multiply."""
assert calculator.multiply(2, 2) == 4
assert calculator.multiply(5, 6) == 30
assert calculator.multiply(9, 3) == 27