М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет164/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   160   161   162   163   164   165   166   167   ...   334
Байланысты:
Изучаем Python


Глава 11 • Тестирование
боты одного конкретного аспекта поведения функции. 
Тестовый сценарий
представ-
ляет собой совокупность модульных тестов, которые совместно доказывают, что 
функция ведет себя так, как положено, во всем диапазоне ситуаций, которые она 
должна обрабатывать. Хороший тестовый сценарий учитывает все возможные виды 
ввода, которые может получать функция, и включает тесты для представления 
всех таких ситуаций. Тестовый сценарий 
с полным покрытием
включает полный 
спектр модульных тестов, покрывающих все возможные варианты использования 
функции. Обеспечение полного покрытия для крупного проекта может быть весьма 
непростой задачей. Часто бывает достаточно написать модульные тесты для кри-
тичных аспектов поведения вашего кода, а затем стремиться к полному покрытию 
только в том случае, если проект перейдет в фазу масштабного использования.
Прохождение теста
Вы не сразу привыкнете к синтаксису создания тестовых сценариев, но после того, 
как тестовый сценарий будет создан, вы сможете легко добавить новые модульные 
тесты для своих функций. Чтобы написать тестовый сценарий для функции, импор-
тируйте модуль 
unittest
и функцию, которую необходимо протестировать. Затем 
создайте класс, наследующий от 
unittest.TestCase
, и напишите серию методов для 
тестирования различных аспектов поведения своей функции.
Ниже приведен тестовый сценарий с одним методом, который проверяет, что функ-
ция 
get_formatted_name()
правильно работает при передаче имени и фамилии:
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')

if __name__ == '__main__':
unittest.main()
Сначала мы импортируем 
unittest
и тестируемую функцию 
get_formatted_name()

В точке 

создается класс 
NamesTestCase
, который содержит серию модульных 
тестов для 
get_formatted_name()
. Имя класса выбирается произвольно, но лучше 
выбрать имя, связанное с функцией, которую вы собираетесь тестировать, и вклю-
чить в имя класса слово 
Test
. Этот класс должен наследовать от класса 
unittest.
TestCase
, чтобы Python знал, как запустить написанные вами тесты.
Класс 
NamesTestCase
содержит один метод, который тестирует всего один аспект 
get_formatted_name()
— правильность форматирования имен, состоящих только из 


Тестирование функции
225
имени и фамилии. Мы назвали этот метод 
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'
. Если они 
равны, как и ожидалось, — хорошо. Но если они не равны, обязательно сообщи 
мне!»
Мы запустим этот файл напрямую, но важно заметить, что многие тестовые фрейм-
ворки импортируют ваши тестовые файлы перед их выполнением. При импортиро-
вании файла интерпретатор выполняет файл в процессе импортирования. Блок 
if
в точке 

проверяет специальную переменную 
__name__
, значение которой задается 
при выполнении программы. Если файл выполняется как главная программа, то 
переменной 
__name__
будет присвоено значение 
'__main__'
. В этом случае вызы-
вается метод 
unittest.main()
, который выполняет тестовый сценарий. Если файл 
импортируется тестовым сценарием, то переменная 
__name__
будет содержать 
значение 
'__main__'
, и этот блок выполняться не будет.
При запуске 
test_name_function .py
будет получен следующий результат:

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 
OK
Точка в первой строке вывода сообщает, что один тест прошел успешно. Следую-
щая строка говорит, что для выполнения одного теста Python потребовалось менее 
0,001 секунды. Наконец, завершающее сообщение 
OK
говорит о том, что прошли все 
модульные тесты в тестовом сценарии.
Этот результат показывает, что функция 
get_formatted_name()
успешно работает 
для полных имен, состоящих из имени и фамилии, если только функция не была 
изменена. В случае внесения изменений в 
get_formatted_name()
тест можно запу-
стить снова. И если тестовый сценарий снова пройдет, мы будем знать, что функция 
продолжает успешно работать с полными именами из двух компонентов.


226

Достарыңызбен бөлісу:
1   ...   160   161   162   163   164   165   166   167   ...   334




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет