Pytest

samnaka·2020년 7월 2일
1

test

목록 보기
2/2
post-thumbnail

pytest 설명

설치

pip install pytest or poetry add pytest

명령어 도움말

pytest -h

파일명 명시 없이 실행

test_로 시작하거나 _test.py로 끝나는 파일이 현재 디렉토리, 하위 디렉토리에 있으면 실행된다. pytest는 test prefix, postfix가 있으면 테스트 파일로 인식한다.
물론 파일명 명시해서 실행할 수도 있다.

테스트 함수명

pytest는 테스트 함수가 test로 시작하는 걸 요구한다. test로 시작하는 포맷이 아니라면 pytest는 이걸 테스트 함수로 고려하지 않는다. test로 시작하지 않는 함수를 테스트로 인식하도록 명시할 수 없다.

테스트 디렉토리, 파일 생성

pycharm에서 프로젝트 생성, pytest 설치, preferences에서 tools -> python integrated tools -> default test runner -> pytest로 변경
터미널에서 pytest 입력 또는 IDE에서 직접 실행



성공이면 PASSED, 실패면 FAILED

테스트 파일 실행

테스트 파일을 test_1.py test_2.py 만든다.

pytest를 치면 디렉토리의 테스트 파일들이 실행된다. -v 옵션을 붙이면 설명이 더 붙는다.
pytest 파일명으로 특정 테스트 파일만 실행할 수 있다.

테스트 모음의 서브셋 실행

  • 테스트명의 부분 문자열 일치를 기반으로 선택 테스트
  • 마커 기반으로 묶인 선택 테스트

테스트명의 부분 문자열 일치로 테스트 실행하기

pytest -k 테스트명

테스트명에 bye가 들어갔다면 pytest -k bye로 실행시킬 수 있다. bye가 파일명에 포함되어 있지 않은 것들은 deselected된다.

마커 기반으로 묶인 테스트 실행하기

테스트 함수에 마크 데코레이터를 사용한다.
@pytest.mark.마커명

@pytest.mark.bye
test_bye():
    assert True

test -m bye로 실행

테스트 통과는 되는데 typo 아니냐는 로그가 찍힌다.
pytest.ini 파일 내에 마커를 명시해준다.

[pytest]
markers = bye: mark a test as a bye.

fixture

fixtures는 적용된 각 테스트 함수 직전에 실행되는 함수다. DB 연결, 테스트할 URL, 일련의 데이터 입력같은 테스트에 데이터를 전할 때 사용된다. 그러므로 매 테스트마다 같은 코드를 실행하는 대신 테스트들에 fixture를 붙이면 fixture는 실행되고 데이터를 반환할 것이다.
@pytest.fixture
테스트 함수는 fixture 이름을 인자에 넣어서 사용할 수 있다.

import pytest


@pytest.fixture
def something():
    return 'bye'


@pytest.mark.bye
def test_say_something(something):
    assert something == 'bye'

저렇게 테스트 파일 내에 fixture를 넣으면 다른 테스트 파일에서 쓸 수가 없다. 범용적으로 사용하려면 conftest.py에 작성해야 한다.

conftest.py

fixture 함수들을 이 파일에 작성하면 여러 테스트 파일들에서 접근가능하다.
conftest.py 파일을 생성하고 fixture들을 작성해준다.
여러 테스트 파일에서 fixture 이름을 인자로 넣어주면 사용 가능하다. test는 동일 파일 내에서 fixture를 찾고 없으면 conftest에서 찾는다. 찾으면 fixture를 실행한다.

parameterize

동일 메서드에 대해서 여러 값을 테스트하기 위해 사용된다.
@pytest.mark.parameterize("변수명", [(n, m)])

import pytest


@pytest.mark.parametrize("n, result", [(1, 2), (2, 4)])
def test_parameterize(n, result):
    assert n * 2 == result

N번의 테스트 실패 후 테스트 정지

pytest --maxfail = n
or
in pytest.ini

[pytest]
addopts=--maxfail=1

1번 실패하는 케이스가 있으면 바로 테스트가 정지된다.

run test in parallel

테스트 개수가 늘어나다보면 순차적으로 실행하는 되는 것을 보는 것이 매우 답답하다. CPU 수를 늘려서 테스트가 분산 실행되도록 한다.
pip install pytest-xdist
CPU 수 지정
pytest -n 3
in pytest.ini

[pytest]
addopts = -n3
profile
서버 개발, 투자, 운동, 부자 되고 싶다

0개의 댓글