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 ======================