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)
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
220 Глава 11 • Тестирование
Неплохо, но опрос с одним ответом вряд ли можно назвать полезным. Убедимся
в том, что три ответа сохраняются правильно. Для этого в
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)
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
содержит метод
Тестирование класса 221
setUp()
, который позволяет создать эти объекты один раз, а затем использовать их
в каждом из тестовых методов. Если в класс
TestCase
включается метод
setUp()
,
Python выполняет метод
setUp()
перед запуском каждого метода, имя которого на-
чинается с
test_
. Все объекты, созданные методом
setUp()
, становятся доступными
во всех написанных вами тестовых методах.
Используем
setUp()
для создания экземпляра
AnonymousSurvey
и набора ответов,
которые могут использоваться в
test_store_single_response()
и
test_store_
three_responses()
:
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""Тесты для класса AnonymousSurvey."""
def setUp(self):
"""
Создание опроса и набора ответов для всех тестовых методов.
"""
question = "What language did you first learn to speak?"
self.my_survey = AnonymousSurvey(question)
self.responses = ['English', 'Spanish', 'Mandarin']
def test_store_single_response(self):
"""Проверяет, что один ответ сохранен правильно."""
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_responses(self):
"""Проверяет, что три ответа были сохранены правильно."""
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
unittest.main()
Метод
setUp()
решает две задачи: он создает экземпляр опроса и список отве-
тов . Каждый из этих атрибутов снабжается префиксом
self
, поэтому он может
использоваться где угодно в классе. Это обстоятельство упрощает два тестовых
метода, потому что им уже не нужно создавать экземпляр опроса или ответы.
Метод
test_store_single_response()
убеждается в том, что первый ответ в
self.
responses
—
self.responses[0]
— сохранен правильно, а метод
test_store_single_
response()
убеждается в том, что правильно были сохранены все три ответа в
self.
responses
.
При повторном запуске
test_survey .py
оба теста по-прежнему проходят. Эти тесты
будут особенно полезными при расширении
AnonymousSurvey
с поддержкой не-
скольких ответов для каждого участника. После внесения изменений вы можете
повторить тесты и убедиться в том, что изменения не повлияли на возможность
сохранения отдельного ответа или серии ответов.
222 Глава 11 • Тестирование
При тестировании классов, написанных вами, метод
setUp()
упрощает написание
тестовых методов. Вы создаете один набор экземпляров и атрибутов в
setUp()
,
а затем используете эти экземпляры во всех тестовых методах. Это намного проще
и удобнее, чем создавать новый набор экземпляров и атрибутов в каждом тестовом
методе.
Достарыңызбен бөлісу: |