python을 테스트하기 위한 프레임워크
pytest를 사용하기 위해서는 우선 pytest를 추가해주어야 한다.
$> pip install pytest
# poetry를 사용한다면 개발자 옵션으로 pytest dependency 추가
$> poetry add -D pytest
pytest를 추가해주었다면 이제 test를 할 파일들을 만들어주면된다.
테스트를 위한 파일들은 "tests" 라는 별도의 디렉토리에서 관리하며, test하기 위한 함수들은 "test_"로 시작해야하며, 파일명 역시 "test_"로 시작해야 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.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
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마다 멈춤)