[Python] 파이썬 Pytest 코드로 테스트하기


코드 테스트를 하기위해 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


pytest 설명




© 2018. by statssy

Powered by statssy