Глава 11 • Тестирование
test_name_function.py
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""Тесты для 'name_function.py'."""
def test_first_last_name(self):
"""Имена вида 'Janis Joplin' работают правильно?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
Сначала мы импортируем
unittest
и тестируемую функцию
get_formatted_name()
.
В точке
создается класс
NamesTestCase
, который содержит серию модульных
тестов для
get_formatted_name()
. Имя класса выбирается произвольно, но лучше
выбрать имя, связанное с функцией, которую вы собираетесь тестировать, и вклю-
чить в имя класса слово
Test
. Этот класс должен наследовать от класса
unittest.
TestCase
, чтобы Python знал, как запустить написанные вами тесты.
Класс
NamesTestCase
содержит один метод, который тестирует всего один аспект
get_formatted_name()
— правильность форматирования имен, состоящих только из
имени и фамилии. Мы назвали этот метод
test_first_last_name()
. Любой метод,
имя которого начинается с
test_
, будет выполняться автоматически при запуске
test_name_function .py
. В тестовом методе вызывается тестируемая функция и сохра-
няется возвращаемое значение, которое необходимо проверить. В данном примере
вызывается функция
get_formatted_name()
с аргументами
'janis'
и
'joplin'
,
а результат сохраняется в переменной
formatted_name
.
В точке
используется одна из самых полезных особенностей
unittest
: метод
assert
. Методы
assert
проверяют, что полученный результат соответствует тому
результату, который вы рассчитывали получить. В данном случае известно, что
функция
get_formatted_name()
должна вернуть полное имя с пробелами и капита-
лизацией слов, поэтому переменная
formatted_name
должна содержать текст «Janis
Joplin». Чтобы убедиться в этом, мы используем метод
assertEqual()
из модуля
unittest
и передаем ему переменную
formatted_name
и строку
'Janis
Joplin'
.
Вызов
self.assertEqual(formatted_name, 'Janis Joplin')
означает: «Сравни значение
formatted_name
со строкой
'Janis
Joplin'
. Если они
равны, как и ожидалось, — хорошо. Но если они не равны, обязательно сообщи
мне!»
Строка
unittest.main()
приказывает Python выполнить тесты из этого файла.
При запуске
test_name_function .py
будет получен следующий результат:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Тестирование функции
213
Точка в первой строке вывода сообщает, что один тест прошел успешно. Следу-
ющая строка говорит, что для выполнения одного теста Python потребовалось
менее 0,001 секунды. Наконец, завершающее сообщение
OK
говорит о том, что все
модульные тесты в тестовом сценарии прошли.
Этот результат показывает, что функция
get_formatted_name()
успешно работает
для полных имен, состоящих из имени и фамилии, если только функция не была
изменена. В случае внесения изменений в
get_formatted_name()
тест можно запу-
стить снова. И если тестовый сценарий снова пройдет, мы будем знать, что функция
продолжает успешно работать с полными именами из двух компонентов.
Сбой теста
Как выглядит сбойный тест? Попробуем изменить функцию
get_formatted_name()
,
чтобы она работала со вторыми именами, — но сделаем это так, чтобы она перестала
работать с полными именами из двух компонентов.
Новая версия
get_formatted_name()
с дополнительным аргументом второго имени
выглядит так:
name_function.py
def get_formatted_name(first, middle, last):
"""Строит отформатированное полное имя."""
full_name = first + ' ' + middle + ' ' + last
return full_name.title()
Эта версия должна работать для полных имен из трех компонентов, но тестирова-
ние показывает, что она перестала работать для полных имен из двух компонентов.
На этот раз файл
test_name_function .py
выдает следующий результат:
E
======================================================================
ERROR: test_first_last_name (__main__.NamesTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_name_function.py", line 8, in test_first_last_name
formatted_name = get_formatted_name('janis', 'joplin')
TypeError: get_formatted_name() missing 1 required positional argument: 'last'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
На этот раз информации гораздо больше, потому что при сбое теста разработчик
должен знать, почему это произошло. Вывод начинается с одной буквы E
, которая
сообщает, что один модульный тест в тестовом сценарии привел к ошибке. Затем мы
видим, что ошибка произошла в тесте
test_first_last_name()
в
NamesTestCase
.
Конкретная информация о сбойном тесте особенно важна в том случае, если тестовый
сценарий состоит из нескольких модульных тестов. В точке
мы видим стандартную
трассировку, из которой понятно, что вызов функции
get_formatted_name('janis',
'joplin')
перестал работать из-за необходимого позиционного аргумента.
214
Достарыңызбен бөлісу: |