Глава 11 • Тестирование
Реализация таких изменений грозит повлиять на текущее поведение класса
AnonymousSurvey
. Например, может оказаться, что поддержка ввода нескольких
ответов случайно повлияет на процесс обработки одиночных ответов. Чтобы
гарантировать, что доработка модуля не нарушит существующее поведение, для
класса нужно написать тесты.
Тестирование класса AnonymousSurvey
Напишем тест, проверяющий всего один аспект поведения
AnonymousSurvey
. Этот
тест будет проверять, что один ответ на опрос сохраняется правильно. После того
как метод будет сохранен, метод
assertIn()
проверяет, что он действительно на-
ходится в списке ответов:
test_survey.py
import unittest
from survey import AnonymousSurvey
❶
class TestAnonmyousSurvey(unittest.TestCase):
"""Тесты для класса AnonymousSurvey"""
❷
def test_store_single_response(self):
"""Проверяет, что один ответ сохранен правильно."""
question = "What language did you first learn to speak?"
❸
my_survey = AnonymousSurvey(question)
my_survey.store_response('English')
❹
self.assertIn('English', my_survey.responses)
if __name__ == '__main__':
unittest.main()
Программа начинается с импортирования модуля
unittest
и тестируемого класса
AnonymousSurvey
. Тестовый сценарий
TestAnonymousSurvey
, как и в предыдущих
случаях, наследует от
unittest.TestCase
. Первый тестовый метод проверяет, что
сохраненный ответ действительно попадает в список ответов опроса. Этому методу
присваивается хорошее содержательное имя
test_store_single_response()
.
Если тест не проходит, имя метода в выходных данных сбойного теста ясно пока-
зывает, что проблема связана с сохранением отдельного ответа на опрос.
Чтобы протестировать поведение класса, необходимо создать экземпляр класса.
В точке
создается экземпляр с именем
my_survey
для вопроса
"What
language
did
you
first
learn
to
speak?"
. Один ответ (
English
) сохраняется с использова-
нием метода
store_response()
. Затем программа убеждается в том, что ответ был
сохранен правильно; для этого она проверяет, что значение
English
присутствует
в списке
my_survey.responses
.
При запуске программы
test_survey .py
тест проходит успешно:
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Тестирование класса
233
Неплохо, но опрос с одним ответом вряд ли можно назвать полезным. Убедимся
в том, что три ответа сохраняются правильно. Для этого в
TestAnonymousSurvey
добавляется еще один метод:
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""Тесты для класса AnonymousSurvey"""
def test_store_single_response(self):
...
def test_store_three_responses(self):
"""Проверяет, что три ответа были сохранены правильно."""
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
❶
responses = ['English', 'Spanish', 'Mandarin']
for response in responses:
my_survey.store_response(response)
❷
for response in responses:
self.assertIn(response, my_survey.responses)
if __name__ == '__main__':
unittest.main()
Новому методу присваивается имя
test_store_three_responses()
. Мы создаем
объект опроса по аналогии с тем, как это делалось в
test_store_single_response()
.
Затем определяется список, содержащий три разных ответа
, и для каждого из
этих ответов вызывается метод
store_response()
. После того как ответы будут
сохранены, следующий цикл проверяет, что каждый ответ теперь присутствует
в
my_survey.responses
.
Если снова запустить
test_survey .py
, оба теста (для одного ответа и для трех ответов)
проходят успешно:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Все прекрасно работает. Тем не менее тесты выглядят немного однообразно, по-
этому мы воспользуемся еще одной возможностью
unittest
для повышения их
эффективности.
Метод setUp()
В программе
test_survey .py
в каждом тестовом методе создавался новый экземпляр
AnonymousSurvey
, а также новые ответы. Класс
unittest.TestCase
содержит метод
234
Достарыңызбен бөлісу: |