Книга «Изучаем Python»



Pdf көрінісі
бет130/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   126   127   128   129   130   131   132   133   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 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
выдает следующий результат:
 

====================================================================== 
 
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

Достарыңызбен бөлісу:
1   ...   126   127   128   129   130   131   132   133   ...   266




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

    Басты бет