Выбираем Test Runner

Test Runner – это приложение, используемое для запуска тестов, проверки выходных данных, а также предоставления инструментов, необходимых для диагностики и отладки тестов. В Python доступно много тест-раннеров. Вот тройка наиболее популярных: — unittest; — nose или nose2; — pytest.

Unittest

Unittest встроен в стандартную библиотеку Python. Он содержит и тестовую среду, и Test Runner. У unittest есть ряд требований для написания и выполнения тестов: — вы помещаете тесты в методы класса unittest.TestCase; — вы используете специальные методы утверждения класса unittest.TestCase, а не встроенный оператор assert.

Пример кода с unittest:

import unittest

class TestSum(unittest.TestCase):

def test_sum(self):
self.assertEqual(sum([1, 2, 3]), 6, "Should be 6")

def test_sum_tuple(self):
self.assertEqual(sum((1, 2, 2)), 6, "Should be 6")

if __name__ == '__main__':
unittest.main()

Запустив файл в командной строке, мы увидим один успешный тест (обозначен точкой) и один сбой (обозначен буквой F):

$ python test_sum_unittest.py
.F
======================================================================
FAIL: test_sum_tuple (__main__.TestSum)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_sum_unittest.py", line 9, in test_sum_tuple
self.assertEqual(sum((1, 2, 2)), 6, "Should be 6")
AssertionError: Should be 6

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Примечание: будьте внимательны, если пишете тесты для выполнения и в Python 2, и в Python 3. Например, в Python 2.7 и ниже unittest обозначается unittest2.

Для получения дополнительной информации о unittest, смотрите официальную документацию.

Nose

Написав сотни или тысячи тестов для приложения, вам станет всё труднее использовать результаты unittest. И вот здесь на помощь приходит nose. Он совместим с любыми тестами, написанными для среды unittest, и может стать неплохой заменой. Правда, развитие nose в качестве приложения с открытым исходным кодом немного поотстало, поэтому появился форк nose2. Если начинаете только изучать автоматизированное тестирование, используйте nose2 вместо nose.

Итак, для начала работы с nose2 выполните его установку из PyPI. Nose2 обнаружит все тестовые сценарии с именами test_*.py, которые унаследованы от unittest.

Пример TestCase:

$ pip install nose2
$ python -m nose2
.F
===============================================================
FAIL: test_sum_tuple (__main__.TestSum)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_sum_unittest.py", line 9, in test_sum_tuple
self.assertEqual(sum((1, 2, 2)), 6, "Should be 6")
AssertionError: Should be 6

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Nose2 предоставляет много флагов командной строки для фильтрации выполняемых тестов. Документация здесь.

Pytest

Pytest тоже поддерживает тесты, созданные с unittest. Его плюс заключается в особенностях написания TestCase. TestCase в pytest — это серия функций в файле Python, которые начинаются с имени test_.

Есть и другие возможности: — поддержка встроенного оператора assert (не нужно использовать специальные методы self.assert); — поддержка фильтрации; — возможность перезапуска, начиная с последнего неудачного теста; — экосистема из сотен плагинов, расширяющих функциональность.

Написание теста TestSum в pytest выглядит так:

def test_sum():
assert sum([1, 2, 3]) == 6, "Should be 6"

def test_sum_tuple():
assert sum((1, 2, 2)) == 6, "Should be 6"

Здесь удалены базовый класс TestCase и любое использование классов в принципе, а также точка входа с командной строки. Как обычно, дополнительная информация представлена на сайте Pytest.

Материал взят из статьи Anthony Shaw «Getting Started With Testing in Python».