[TDD] pytest를 이용한 TDD

강버섯·2022년 1월 6일
0

👉 pytest?

python을 테스트하기 위한 프레임워크

👉 사용하기

✏️ 사용하기 전에,,,

pytest를 사용하기 위해서는 우선 pytest를 추가해주어야 한다.

$> pip install pytest

# poetry를 사용한다면 개발자 옵션으로 pytest dependency 추가
$> poetry add -D pytest

pytest를 추가해주었다면 이제 test를 할 파일들을 만들어주면된다.
테스트를 위한 파일들은 "tests" 라는 별도의 디렉토리에서 관리하며, test하기 위한 함수들은 "test_"로 시작해야하며, 파일명 역시 "test_"로 시작해야 pytest가 감지하여 테스트를 실행할 수 있다.

✏️ pytest 실행

test 코드를 작성했다면 이제 실행시켜 테스트 코드가 잘 돌아가는지 확인하자.

$> py.test -ssv #전체 실행
$> py.test -ssv 파일명.py #특정 파일에 존재하는 test 함수 실행
$> py.test -ssv 파일명.py::함수이름 #특정 파일의 특정 함수만 실행

#or
$> pytest 파일명.py 

$> pytest -v #더 자세한 테스트 결과를 확인할 수 있음
pytest # 존재하는 모든 test를 모두 실행

$> pytest [dir경로] # 해당 directory에 존재하는 모든 test_...py 파일 모두 실행

$> pytest [파일 경로] # 해당 파일에 존재하는 모든 test 함수 실행

$> pytest [파일 경로]::테스트함수명 # 특정 test 함수만 실행


이 외의 더 다양한 옵션들은 $> pytest --help를 통해 확인할 수 있다.

✏️ pytest 활용

- pytest.fixture()
중복되는 부분에 대해서 fixture를 선언하고, fixture 함수를 parameter로 사용하여 테스트를 진행한다.
fixture를 사용하면 매번 선언하지 않고 간단히 parameter를 통해 필요한 값을 가져올 수 있다.

import pytest

@pytest.fixture
def calculator():
	calculator = Calculator()
	return calculator

def test_add(calculator):
	#calculator = Calculator() >> 원래 반복적으로 선언해줘야 했던 부분
	assert calculator.add(1, 2) == 3
	
def test_subtract(calculator):
	#calculator = Calculator()
	assert calculator.subtract(5, 1) == 4

이러한 fixture들은 "conftest.py" 라는 파일에 모아 선언하여 모든 테스트 코드에서 공유하여 쓰게 할 수 있다.

  • Dir 구조 👇
    tests
         L conftest.py
         L clacl.py -> Calc() 존재
         L test_clac.py

  • conftest.py 👇

from calc import Calc

import pytest

@pytest.fixture
def calc():
	calc = Calc()
	return calc
  • test_calc.py 👇
def test_add_two_numbers(calc):
	res = calc.add(3,4)
	
	assert res == 7

def test_sub_two_numbers(calc):
	res = calc.sub(5,1)


	assert res == 4

- pytest.raises(Error명)
error가 발생하는 test를 작성하고 error 발생 여부를 확인할 수 있다.

import pytest

def test_func():
	with pytest.raises(Error명):
		#error가 발생하기를 바라는 코드
        
	# 예외에 대한 직접적인 정보를 얻고자 할 때 사용
	with pytest.raises(error) as e:
		# 코드

	# 스트링으로 나타낸 예외 상황과 넘겨 받은 파라미터가 일치하는지 확인
	# -> 예외의 메세지 값
	with pytest.raises(error, match=""):
		# 코드

- pytest.approx(값)

import pytest

def test_func():
	res = 실행
	
	assert res == pytest.approx() #적힌 값과 유사한 값이 도출되는지 검사

- pytest.mark.skip(메세지)
테스트 코드를 실행시키지 않고자 할 때 사용한다.

@pytest.mark.skip('message')
def test_img_src_factory():
    # 테스트 내용.....

- pytest.mark.order(순서값)
정해진 순서대로 테스트를 진행시키고 싶을 때 사용한다.

@pytest.mark.order(순서)
def test_order():
	# 테스트 내용...

pytest order를 사용하기 위해서는 pytest-order 플러그인 설치해주어야한다.
👉 pytest-order docs

$> pip install pytest-order

# poetry 사용 시
$> poetry add -D pytest-order

- debugging

$> pytest --pdb #모든 실패마다 멈춤
$> pytest -x --pdb #첫번째 실패에 멈추고 test session 종료
$> pytest -pdb --maxfail=n #n번째 실패까지

$> pytest --trace #debugging처럼 진행 과정을 따라갈 수 있음(매 test마다 멈춤)
profile
무럭무럭 버섯농장

0개의 댓글