Мы уже рассмотрели основные принципы написание тестов, но один важный момент упустили, а именно дебаг тестов.
Посмотрим на небольшой (надуманный) пример:
# use_debug.py
@py.test.mark.parametrize("v", range(1, 5))
def test_parity(v):
print("Value: %d" % v)
assert v % 2
>>>py.test use_debug.py -s -v --tb line
============================= test session starts =============================
platform win32 -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- C:\Python27\python.exe
plugins: teamcity-messages, rerunfailures
collected 4 items
use_debug.py:40: test_parity[1] Value: 1
PASSED
use_debug.py:40: test_parity[2] Value: 2
FAILED
use_debug.py:40: test_parity[3] Value: 3
PASSED
use_debug.py:40: test_parity[4] Value: 4
FAILED
================================== FAILURES ===================================
c:\JOB\3_TestSolution\Blog\use_debug.py:43: assert (2 % 2)
c:\JOB\3_TestSolution\Blog\use_debug.py:43: assert (4 % 2)
===================== 2 failed, 2 passed in 0.03 seconds ======================
Как видим в консоли напечатались входные значения.
>>>py.test use_debug.py -s -v --tb line --pdb
platform win32 -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- C:\Python27\python.exe
plugins: teamcity-messages, rerunfailures
collected 4 items
use_debug.py:64: test_parity[1]
>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>
> c:\job\3_testsolution\blog\use_debug.py(67)test_parity()
-> assert v % 2
(Pdb)
Из коробки py.test предоставляет возможность в коде явно указать брекпоинт.
# use_debug.py
@py.test.mark.parametrize("v", range(1, 5))
def test_parity(v):
py.test.set_trace()
assert v % 2
При каджом вызове тестовой функции test_parity в месте устанвки брейкпоинта py.test будет запускать pdb
>>>py.test use_debug.py -s -v --tb line
use_debug.py:62: test_v[1]
>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>
> c:\job\3_testsolution\blog\use_debug.py(65)test_v()
-> assert v % 2
(Pdb)
http://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace
Использование print
Часто люди пользующие питон дебажат свои скрипты с помощью использования принтов. По умолчанияю pytest пишет весь stout и stderr. В предыдущем посте эта тема рассматривалась. Для отключения этой особенности нужно использовать параметр --capture или маску -s.Посмотрим на небольшой (надуманный) пример:
# use_debug.py
@py.test.mark.parametrize("v", range(1, 5))
def test_parity(v):
print("Value: %d" % v)
assert v % 2
>>>py.test use_debug.py -s -v --tb line
============================= test session starts =============================
platform win32 -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- C:\Python27\python.exe
plugins: teamcity-messages, rerunfailures
collected 4 items
use_debug.py:40: test_parity[1] Value: 1
PASSED
use_debug.py:40: test_parity[2] Value: 2
FAILED
use_debug.py:40: test_parity[3] Value: 3
PASSED
use_debug.py:40: test_parity[4] Value: 4
FAILED
================================== FAILURES ===================================
c:\JOB\3_TestSolution\Blog\use_debug.py:43: assert (2 % 2)
c:\JOB\3_TestSolution\Blog\use_debug.py:43: assert (4 % 2)
===================== 2 failed, 2 passed in 0.03 seconds ======================
Как видим в консоли напечатались входные значения.
Автовключение дебага
Для этого предусмотрен флаг --pdb. Если тест пофелился, то py.test прогонит его на тех же данных, но уже с включенным питоновским дебагером pdb.>>>py.test use_debug.py -s -v --tb line --pdb
platform win32 -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- C:\Python27\python.exe
plugins: teamcity-messages, rerunfailures
collected 4 items
use_debug.py:64: test_parity[1]
>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>
> c:\job\3_testsolution\blog\use_debug.py(67)test_parity()
-> assert v % 2
(Pdb)
Брейкпоинты
Из коробки py.test предоставляет возможность в коде явно указать брекпоинт.
# use_debug.py
@py.test.mark.parametrize("v", range(1, 5))
def test_parity(v):
py.test.set_trace()
assert v % 2
При каджом вызове тестовой функции test_parity в месте устанвки брейкпоинта py.test будет запускать pdb
>>>py.test use_debug.py -s -v --tb line
use_debug.py:62: test_v[1]
>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>
> c:\job\3_testsolution\blog\use_debug.py(65)test_v()
-> assert v % 2
(Pdb)
Ссылки
http://pytest.org/latest/usage.html#dropping-to-pdb-python-debugger-on-failureshttp://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace
Комментариев нет:
Отправить комментарий