Автостопом по Python | страница 61
Если тест просто объяснить, он почти всегда хорош. Код теста можно использовать в качестве руководства для новых разработчиков. Если другим людям нужно работать с базой кода, запуск и чтение соответствующих тестов — это лучшее, что они могут сделать. Они обнаружат (по крайней мере должны обнаружить) проблемные места, вызывающие больше всего трудностей, а также пограничные случаи. Если им нужно добавить какую-то функциональность, в первую очередь следует добавить тест (это гарантирует ее появление).
Не паникуйте! Это же ПО с открытым исходным кодом! Вас поддержит весь мир.
Основы тестирования
В этом разделе приводятся основы тестирования, чтобы у вас было представление о доступных вариантах, и примеры из проектов Python, которые мы рассмотрим в главе 5. Есть целая книга, посвященная TDD в Python, мы не хотим переписывать ее здесь. Она называется Test-Driven Development with Python (издательство O’Reilly).
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
В версии Python 3.3 unittest.mock (https://docs.python.org/dev/library/unittest.mock