Выбираем Test Runner
Test Runner – это приложение, используемое для запуска тестов, проверки выходных данных, а также предоставления инструментов, необходимых для диагностики и отладки тестов. В Python доступно много тест-раннеров. Вот тройка наиболее популярных:
Unittest
Unittest встроен в стандартную библиотеку Python. Он содержит и тестовую среду, и Test Runner. У unittest есть ряд требований для написания и выполнения тестов:
— вы помещаете тесты в методы класса
Пример кода с 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».