Класс unittest.TestCase содержит целое семейство проверочных методов assert. Как упоминалось ранее, эти методы проверяют, выполняется ли условие, которое должно выполняться в определенной точке вашего кода. Если условие истинно, как и предполагалось, то ваши ожидания относительно поведения части вашей программы подтверждаются; вы можете быть уверены в отсутствии ошибок. Если же условие, которое должно быть истинным, окажется ложным, то Python выдает исключение.
В табл. 11.1 перечислены шесть часто используемых методов assert. С их помощью можно проверить, что возвращаемые значения равны или не равны ожидаемым, что значения равны True или False или что значения входят или не входят в заданный список. Эти методы могут использоваться только в классах, наследующих от unittest.TestCase; рассмотрим пример использования такого метода в контексте тестирования реального класса.
Таблица 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():
. ."""Сбор анонимных ответов на опросы."""
. .
(1) . .def __init__(self, question):
. . . ."""Сохраняет вопрос и готовится к сохранению ответов."""
. . . .self.question = question
. . . .self.responses = []
. . . .
(2) . .def show_question(self):
. . . ."""Выводит вопрос."""
. . . .print(question)
. . . .
(3) . .def store_response(self, new_response):
. . . ."""Сохраняет один ответ на опрос."""
. . . .self.responses.append(new_response)
. . . .
(4) . .def show_results(self):
. . . ."""Выводит все полученные ответы."""
. . . .print("Survey results:")
. . . .for response in responses:
. . . . . .print('- ' + response)
Класс начинается с вопроса, предоставленного администратором (1) , и включает пустой список для хранения ответов. Класс содержит методы для вывода вопроса (2), добавления нового ответа в список ответов (3) и вывода всех ответов, хранящихся в списке (4). Чтобы создать экземпляр на основе этого класса, необходимо предоставить вопрос. После того как будет создан экземпляр, представляющий конкретный опрос, программа выводит вопрос методом show_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, в котором он находится. Например, каждому пользователю будет разрешено ввести несколько ответов. Или вы напишете метод, который будет выводить только уникальные ответы и сообщать, сколько раз был дан тот или иной ответ. Или вы напишете другой класс для проведения неанонимных опросов.