pytest 공식 문서를 바탕으로 요약 정리 한 문서
설치
pip install -U pytest
예제
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
실행
test_sample.py 파일이 있는 경로에서 pytest 입력
아래는 실행 결과이다.
pytest에서 test 파일을 감지하는 방법은 pytest convention rule에 나와있는데 간단히 요약하면 다음과 같다.
- 기본적으로 arg가 없으면 현재 디렉터리에 있는 test파일을 찾지만, 옵션으로 줄 수도 있다.
- recursive dir가 아니면(norecursedirs) 재귀적으로 디렉터리를 탐색한다.
- 디렉터리를 탐색할 때
test_*.py
또는*_test.py
를 찾는다. - 위에서 찾은 파일을 바탕으로, 아래와 같은 test 요소들을 수집한다.
- 이름이 test_ 로 시작하는 클래스 외부의 function.
- 클래스 이름이 Test로 시작하는 클래스 내에서 이름이 test_로 시작하는 메서드(
__init__
이 없어야 함)
- 파이썬 모듈에서는, 표준 unittest.TestCase 을 사용해 테스트들을 감지한다.
다중 테스트 실행
특정 exception이 일어나는 것을 assert 해보자
# content of test_sysexit.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
with 구문을 사용해서 예외를 raises를 시킨 코드이다. 위의 프로그램을 -q 옵션(로그를 간단히 표시하는 옵션)을 통해 실행해 보면, 아래와 같다
$ pytest -q test_sysexit.py
.
1 passed in 0.12 seconds
Going functional: requesting a unique temporary directory
Functional 테스트의 경우 몇몇 파일을 만들어서 어플리케이션에 넘겨야 할 수 있습니다. 인자를 넘기면 pytest는 fixture factory를 찾아서 테스트 함수 호출을 진행하기 전에 resource 제작을 하도록 합니다.
예를 들어 아래와 같은 파이썬 파일을 만든다하면
# content of test_tmpdir.py
def test_needsfiles(tmpdir):
print (tmpdir)
assert 0
자세한 정보는 Temporary directories and files 에 나와 있습니다.
pytest –fixtures를 치면, pytest의 fixture들 을 확인 할 수 있습니다
Usage and Invocations
python -m pytest [...]
을 이용해서 pytest를 사용할 수도 있는데, 이는 pytest […] 랑 거의 비슷한 명령어입니다.
version, option 이름, 환경 변수 도움말 사용 방법
pytest --version # pytest 버전 확인
pytest --fixtures # 사용 가능한 builtin function arguments 확인
pytest -h | --help # 커맨드 라인 및 설정 파일 옵션 확인
N번째 실패시 테스팅 정지시키는 방법
pytest -x # 첫 번째 실패 시 중지
pytest --maxfail=2 # 두 번째 실패 시 중지
테스트 선택 / 지정
pytest test_mod.py # 모듈 내 테스트 실행
pytest somepath # 특정 경로 아래 모든 테스트 수행
pytest -k stringexpr # 특정 "문자열 표현"과 이름이 매칭되는 테스트만 실행
# 예시 : "My Class and not method"
# TestMyClass.test_something은 선택 되지만
# TestMyClass.test_method_simple을 선택 안됨
pytest test_mod.py::test_func # "노드 id"와 매칭되는 테스트들만 실행
# 예시 : "test_mod.py::test_func"은
# test_mod.py의 test_func만 실행된다.
pytest test_mod.py::TestClass::test_method # 단일 클래스 내 단일 메서드 실행
pytest --pyargs pkg # pkg 디렉터리 하위에 있는 모든 테스트를 실행합니다.
Modifying Python traceback printing
pytest --showlocals # trackback 내 모든 지역 변수들을 보여준다.
pytest -l # 모든 지역 변수들을 보여준다(short cut)
pytest --tb=auto # (기본 설정) 첫 번째와 마지막 엔트리는 '긴' trackback 이지만
# 다른 엔트리는 '짧은' trackback
pytest --tb=long # 완전한 정보들을 제공하는 형식의 trackback
pytest --tb=short # 짧은 형식의 trackback
pytest --tb=line # 실패 당 한 줄로 표시
pytest --tb=native # 파이썬 표준 포맷
pytest --tb=no # trackback 없음
–full-trace 옵션도 있긴한데 넘길어서 에러가 일어난다 한다. 그래서 Ctrl+C로 도중에 중단 시킬수 있다고 한다.
Dropping to PDB(Python Debugger) on failures
pytest는 아래와 같이 커맨드 라인 옵션을 통해 PDB 에 드롭할 수 있습니다.
pytest --pdb
이는 모든 실패 시 마다 파이썬 debugger를 호출합니다. 종종 특정 실패 시 에만 호출하길 원할 경우엔 아래와 같이 한다.
pytest -x --pdb # 첫번째 실패를 PDB에 드롭하고, 테스트 세션을 종료한다.
pytest --pdb --maxfail=3 # 처음 세 번의 실패를 PDB에 드롭한다.
모든 실패 시엔 예외정보는 sys.last_value, sys.last_type, sys.last_traceback에 저장됩니다. interactive로 사용하면 디버그 도구로 사후 디버깅을 할 수 있습니다. 이것은 또한 예외 정보에 수동적으로 접근 할 수 있습니다.
>>> import sys
>>> sys.last_traceback.tb_lineno
42
>>> sys.last_value
AssertionError('assert result == "ok"',)