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.
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
에 작성해야 한다.
fixture 함수들을 이 파일에 작성하면 여러 테스트 파일들에서 접근가능하다.
conftest.py
파일을 생성하고 fixture들을 작성해준다.
여러 테스트 파일에서 fixture 이름을 인자로 넣어주면 사용 가능하다. test는 동일 파일 내에서 fixture를 찾고 없으면 conftest
에서 찾는다. 찾으면 fixture를 실행한다.
동일 메서드에 대해서 여러 값을 테스트하기 위해 사용된다.
@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
pytest --maxfail = n
or
in pytest.ini
[pytest]
addopts=--maxfail=1
1번 실패하는 케이스가 있으면 바로 테스트가 정지된다.
테스트 개수가 늘어나다보면 순차적으로 실행하는 되는 것을 보는 것이 매우 답답하다. CPU 수를 늘려서 테스트가 분산 실행되도록 한다.
pip install pytest-xdist
CPU 수 지정
pytest -n 3
in pytest.ini
[pytest]
addopts = -n3