Таблица 11.1. Методы assert, предоставляемые модулем unittest
Метод
Использование
assertEqual(a, b)
Проверяет, что a == b
assertNotEqual(a, b)
Проверяет, что a != b
assertTrue(x)
Проверяет, что значение x истинно
assertFalse(x)
Проверяет, что значение x ложно
assertIn(элемент, список)
Проверяет, что элемент входит в список
assertNotIn(элемент, список)
Проверяет, что элемент не входит в список
Класс для тестирования
Тестирование класса имеет много общего с тестированием функции — значитель-
ная часть работы направлена на тестирование поведения методов класса. Впрочем,
существуют и различия, поэтому мы напишем отдельный класс для тестирования.
Возьмем класс для управления проведением анонимных опросов:
survey.py
class AnonymousSurvey():
"""Сбор анонимных ответов на опросы."""
def __init__(self, question):
"""Сохраняет вопрос и готовится к сохранению ответов."""
self.question = question
self.responses = []
def show_question(self):
"""Выводит вопрос."""
print(question)
def store_response(self, new_response):
"""Сохраняет один ответ на опрос."""
self.responses.append(new_response)
def show_results(self):
"""Выводит все полученные ответы."""
print("Survey results:")
for response in responses:
print('- ' + response)
Класс начинается с вопроса, предоставленного администратором , и включает
пустой список для хранения ответов. Класс содержит методы для вывода во-
проса , добавления нового ответа в список ответов и вывода всех ответов,
хранящихся в списке . Чтобы создать экземпляр на основе этого класса, не-
обходимо предоставить вопрос. После того как будет создан экземпляр, пред-
ставляющий конкретный опрос, программа выводит вопрос методом
show_
218 Глава 11 • Тестирование
question()
, сохраняет ответ методом
store_response()
и выводит результаты
вызовом
show_results()
.
Чтобы продемонстрировать, что класс
AnonymousSurvey
работает, напишем про-
грамму, которая использует этот класс:
language_survey.py
from survey import AnonymousSurvey
# Определение вопроса с созданием экземпляра AnonymousSurvey.
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
# Вывод вопроса и сохранение ответов.
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
response = input("Language: ")
if response == 'q':
break
my_survey.store_response(response)
# Вывод результатов опроса.
print("\nThank you to everyone who participated in the survey!")
my_survey.show_results()
Программа определяет вопрос и создает объект
AnonymousSurvey
на базе этого во-
проса. Программа вызывает метод
show_question()
для вывода вопроса, после чего
переходит к получению ответов. Каждый ответ сохраняется сразу же при получе-
нии. Когда ввод ответов был завершен (пользователь ввел
q
), метод
show_results()
выводит результаты опроса:
What language did you first learn to speak?
Enter 'q' at any time to quit.
Language: English
Language: Spanish
Language: English
Language: Mandarin
Language: q
Thank you to everyone who participated in the survey!
Survey results:
- English
- Spanish
- English
- Mandarin
Этот класс работает для простого анонимного опроса. Но допустим, вы решили
усовершенствовать класс
AnonymousSurvey
и модуль
survey
, в котором он находит-
ся. Например, каждому пользователю будет разрешено ввести несколько ответов.
Или вы напишете метод, который будет выводить только уникальные ответы
и сообщать, сколько раз был дан тот или иной ответ. Или вы напишете другой класс
для проведения неанонимных опросов.
Тестирование класса 219
Реализация таких изменений грозит повлиять на текущее поведение класса
AnonymousSurvey
. Например, может оказаться, что поддержка ввода нескольких
ответов случайно повлияет на процесс обработки одиночных ответов. Чтобы га-
рантировать, что доработка модуля не нарушит существующего поведения, для
класса нужно написать тесты.
Тестирование класса AnonymousSurvey
Напишем тест, проверяющий всего один аспект поведения
AnonymousSurvey
. Этот
тест будет проверять, что один ответ на опрос сохраняется правильно. После того
как метод будет сохранен, метод
assertIn()
проверяет, что он действительно на-
ходится в списке ответов:
Достарыңызбен бөлісу: |