Автостопом по Python | страница 61



), чем рабочий код. Юнит-тест, чье предназначение неясно, не принесет большой пользы.

Если тест просто объяснить, он почти всегда хорош. Код теста можно использовать в качестве руководства для новых разработчиков. Если другим людям нужно работать с базой кода, запуск и чтение соответствующих тестов — это лучшее, что они могут сделать. Они обнаружат (по крайней мере должны обнаружить) проблемные места, вызывающие больше всего трудностей, а также пограничные случаи. Если им нужно добавить какую-то функциональность, в первую очередь следует добавить тест (это гарантирует ее появление).

Не паникуйте! Это же ПО с открытым исходным кодом! Вас поддержит весь мир.

Основы тестирования

В этом разделе приводятся основы тестирования, чтобы у вас было представление о доступных вариантах, и примеры из проектов Python, которые мы рассмотрим в главе 5. Есть целая книга, посвященная TDD в Python, мы не хотим переписывать ее здесь. Она называется Test-Driven Development with Python (издательство O’Reilly).

unittest

unittest — это тестовый модуль стандартной библиотеки Python, готовый к работе сразу после установки. Его API будет знаком всем, кто пользовался любым из этих инструментов — JUnit (Java)/nUnit (.NET)/CppUnit (C/C++).

Создать тест в этом модуле можно путем создания подкласса для unittest.TestCase. В этом примере функция тестирования определяется как новый метод в MyTest:

># test_example.py

>import unittest

>def fun(x):

>····return x + 1

>class MyTest(unittest.TestCase):

>····def test_that_fun_adds_one(self):

>········self.assertEqual(fun(3), 4)

>class MySecondTest(unittest.TestCase):

>····def test_that_fun_fails_when_not_adding_number(self):

>········self.assertRaises(TypeError, fun, "multiply six by nine")


Методы теста должны начинаться со строки test — иначе они не запустятся. Тестовые модули должны следовать шаблону test*.py по умолчанию, но могут соответствовать любому шаблону, который вы передадите с помощью аргумента с ключевым словом pattern в командной строке.


Для того чтобы запустить все тесты в TestClass, откройте терминальную оболочку. Находясь в том же каталоге, где файл, вызовите из командной строки модуль unittest:

>$ python — m unittest test_example.MyTest

>.

>---

>Ran 1 test in 0.000s

>OK

Для запуска всех тестов из файла укажите файл:

>$ python — m unittest test_example

>.

>---

>Ran 2 tests in 0.000s

>OK

Mock (в модуле unittest)

В версии Python 3.3 unittest.mock (https://docs.python.org/dev/library/unittest.mock