사용법 그리고 실행방법(1)

4 minute read

Terminal command로 python을 이용하더라도, -m 옵션 flag를 통해 pytest를 실행할 수 있습니다.
python -m pytest

python -m pytest가 현재 위치의 directory를 sys.path에 저장한다는 사실 이외에는 사실상 pytest 명령어와 다를 것이 없습니다.

가능한 종료 상황(exit codes)들은 총 6가지 경우가 있습니다.

모든 테스트들이 성공적으로 모여지고 통과된 경우, Exit code 0

테스트들이 모여지고, 실행되어졌지만 부분적으로 실패한 경우, Exit code 1

유저에 의해 Test가 중지된 경우, Exit code 2

테스트 실행 중 내부 에러가 발생한 경우, Exit code 3

Terminal 상의 pytest command line 사용법에 error가 생긴 경우, Exit code 4

단 하나의 테스트도 모이지 않은 경우, Exit code 5

버젼, 옵션 flag 이름들, 그리고 환경변수들에 관한 정보들

pytest --version   # shows where pytest was imported from
pytest --fixtures  # show available builtin function arguments
pytest -h | --help # show help on command line and config file options

처음 실패 후 멈추거나, (N)회 실패 후 멈추게 하는 방법들 -x(1회) –maxfail=2(2회,-> N회 가능)

pytest -x            # stop after first failure
pytest --maxfail=2    # stop after two failures
Specifying tests / selecting tests
Pytest supports several ways to run and select tests from the command-line.

모듈 상에 있는 테스트 실행하기

pytest test_mod.py

directory 내에 있는 테스트들 실행하기

pytest testing/ 키워드 표현법에 따라 테스트들 실행하기

pytest -k “MyClass and not method” 테스트 중에 주어진 문자열을 포함한 테스트들을 실행하기

Run tests by node ids

노드 ID로 테스트 실행하기 ::로 구분시켜서 실행

모듈 내에서 특정한 테스트를 실행하려면, 아래와 같이 실행하면 됩니다.

pytest test_mod.py::test_func

Another example specifying a test method in the command line:

pytest test_mod.py::TestClass::test_method

마커 표현법으로 테스트들 실행하기

pytest -m slow @pytest.mark.slow decorator를 활용해서 모든 테스트들을 실행하기

For more information see marks.

packages들로부터 테스트들 실행하기

pytest –pyargs pkg.testing 위의 방법으로 pkg.testing을 들여와 그것의 filesystem 상 위치를 찾고, pkg.testing에서 들어온 테스트들을 실행시킵니다.

Python 흔적 출력방식 수정하기

Examples for modifying traceback printing:

pytest --showlocals # show local variables in tracebacks
pytest -l           # show local variables (shortcut)

pytest --tb=auto    # (default) 'long' tracebacks for the first and last
                     # entry, but 'short' style for the other entries
pytest --tb=long    # exhaustive, informative traceback formatting
pytest --tb=short   # shorter traceback format
pytest --tb=line    # only one line per failure
pytest --tb=native  # Python standard library formatting
pytest --tb=no      # no traceback at all

–full-trace는 error에 대해 매우긴 흔적을 남깁니다. –tb=long 옵션과 비교해봐도 깁니다. 또한 –full-trace는 (Ctrl+C)에 따른 stack trace도 출력시킵니다. 이것은 매우 유용한데, 테스트들을 실행하는데 너무 오래 걸려 (Ctrl+C)로 정지 Interrupt 시켰을 경우, 어디 test들에 머물러 있는지 확인할 수 있습니다. 기본값으로는 어떠한 출력값도 나오지 않습니다. 왜냐하면 KeyboardInterrupt이 pytest에 잡혔기 때문이죠. 이러한 옵션을 사용하는 것으로, 흔적을 보이게 할 수 있습니다.

Detailed summary report -r flag는 “short test summary info’ 정보를 테스트 세션 끝에 보이게 하는데 쓸 수 있습니다. 아주 큰 테스트들에 대해서, 모든 실패, 넘긴 상황들을 파악하는데 도움이 됩니다.

Example:

# content of test_example.py
import pytest


@pytest.fixture
def error_fixture():
    assert 0


def test_ok():
    print("ok")


def test_fail():
    assert 0


def test_error(error_fixture):
    pass


def test_skip():
    pytest.skip("skipping this test")


def test_xfail():
    pytest.xfail("xfailing this test")


@pytest.mark.xfail(reason="always xfail")
def test_xpass():
    pass
$ pytest -ra
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 6 items

test_example.py .FEsxX                                               [100%]

================================== ERRORS ==================================
_______________________ ERROR at setup of test_error _______________________

    @pytest.fixture
    def error_fixture():
>       assert 0
E       assert 0

test_example.py:6: AssertionError
================================= FAILURES =================================
________________________________ test_fail _________________________________

    def test_fail():
>       assert 0
E       assert 0

test_example.py:14: AssertionError
========================= short test summary info ==========================
SKIPPED [1] $REGENDOC_TMPDIR/test_example.py:23: skipping this test
XFAIL test_example.py::test_xfail
  reason: xfailing this test
XPASS test_example.py::test_xpass always xfail
ERROR test_example.py::test_error - assert 0
FAILED test_example.py::test_fail - assert 0
= 1 failed, 1 passed, 1 skipped, 1 xfailed, 1 xpassed, 1 error in 0.12 seconds =
The -r options accepts a number of characters after it, with a used above meaning “all except passes”.

Here is the full list of available characters that can be used:

f - failed
E - error
s - skipped
x - xfailed
X - xpassed
p - passed
P - passed with output
a - all except pP
A - all
More than one character can be used, so for example to only see failed and skipped tests, you can execute:

$ pytest -rfs
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 6 items

test_example.py .FEsxX                                               [100%]

================================== ERRORS ==================================
_______________________ ERROR at setup of test_error _______________________

    @pytest.fixture
    def error_fixture():
>       assert 0
E       assert 0

test_example.py:6: AssertionError
================================= FAILURES =================================
________________________________ test_fail _________________________________

    def test_fail():
>       assert 0
E       assert 0

test_example.py:14: AssertionError
========================= short test summary info ==========================
FAILED test_example.py::test_fail - assert 0
SKIPPED [1] $REGENDOC_TMPDIR/test_example.py:23: skipping this test
= 1 failed, 1 passed, 1 skipped, 1 xfailed, 1 xpassed, 1 error in 0.12 seconds =
Using p lists the passing tests, whilst P adds an extra section “PASSES” with those tests that passed but had captured output:

$ pytest -rpP
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 6 items

test_example.py .FEsxX                                               [100%]

================================== ERRORS ==================================
_______________________ ERROR at setup of test_error _______________________

    @pytest.fixture
    def error_fixture():
>       assert 0
E       assert 0

test_example.py:6: AssertionError
================================= FAILURES =================================
________________________________ test_fail _________________________________

    def test_fail():
>       assert 0
E       assert 0

test_example.py:14: AssertionError
================================== PASSES ==================================
_________________________________ test_ok __________________________________
--------------------------- Captured stdout call ---------------------------
ok
========================= short test summary info ==========================
PASSED test_example.py::test_ok
= 1 failed, 1 passed, 1 skipped, 1 xfailed, 1 xpassed, 1 error in 0.12 seconds =