UnitTest Framework - модуль Py.test
В 2004 году Хольгер Крекель переименовал свой stdпакет, имя которого часто путали с именем стандартной библиотеки, поставляемой с Python, на имя (лишь немного менее запутанное) py. Хотя пакет содержит несколько подпакетов, теперь он почти полностью известен своей структурой py.test.
Инфраструктура py.test установила новый стандарт для тестирования Python и сегодня стала очень популярной среди многих разработчиков. Элегантные и питоновские идиомы, которые он ввел для написания тестов, позволили писать наборы тестов в гораздо более компактном стиле.
py.test - это не шаблонная альтернатива стандартному модулю Python unittest. Несмотря на то, что это полнофункциональный и расширяемый инструмент тестирования, он может похвастаться простым синтаксисом. Создать набор тестов так же просто, как написать модуль с парой функций.
py.test работает во всех операционных системах POSIX и WINDOWS (XP / 7/8) с Python версии 2.6 и выше.
Установка
Используйте следующий код для загрузки модуля pytest из текущего дистрибутива Python, а также утилиты py.test.exe. Тесты можно запускать с использованием обоих.
pip install pytest
Применение
Вы можете просто использовать оператор assert для подтверждения ожиданий теста. Самоанализ assert в pytest будет интеллектуально сообщать промежуточные значения выражения assert, освобождая вас от необходимости изучать множество именJUnit legacy methods.
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
Используйте следующую командную строку для запуска вышеуказанного теста. После запуска теста на консоли отображается следующий результат:
C:\Python27>scripts\py.test -v test_sample.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyth
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 1 items
test_sample.py::test_answer FAILED
================================== FAILURES =====================
_________________________________ test_answer _________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:7: AssertionError
========================== 1 failed in 0.05 seconds ====================
Тест также можно запустить из командной строки, включив модуль pytest с помощью переключателя –m.
python -m pytest test_sample.py
Группирование нескольких тестов в класс
Когда у вас появляется больше, чем несколько тестов, часто имеет смысл сгруппировать тесты логически, по классам и модулям. Напишем класс, содержащий два теста -
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
Будет отображен следующий результат теста -
C:\Python27>scripts\py.test -v test_class.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyt
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 2 items
test_class.py::TestClass::test_one PASSED
test_class.py::TestClass::test_two FAILED
================================== FAILURES =====================
_____________________________ TestClass.test_two ______________________________
self = <test_class.TestClass instance at 0x01309DA0>
def test_two(self):
x = "hello"
> assert hasattr(x, 'check')
E assert hasattr('hello', 'check')
test_class.py:7: AssertionError
===================== 1 failed, 1 passed in 0.06 seconds ======================