Рубрики
Без рубрики

Введение в тестирование подразделения в Python

Автор оригинала: Goran Aviani.

Вы только что закончили писать кусок кода, и вам интересно, что делать. Будете ли вы представить запрос на тягу и попросите своих товарищей по команде просмотреть код? Или вы вручную проверите код?

Вы должны сделать обоими этими вещами, но с дополнительным шагом: вам необходимо установить свой код, чтобы убедиться, что код работает как предназначен.

Устройства могут пройти или не удавать, и это делает их отличной техникой для проверки вашего кода. В этом руководстве я продемонстрирую, как писать тесты подразделения в Python, и вы увидите, насколько легко заставить их идти в свой собственный проект.

Лучший способ понять тестирование, если вы делаете это практически. Для этого в файле имени имя_функция .py, я напишу простую функцию, которая принимает имя и фамилию, и возвращает полное имя:

#Generate a formatted full name
def formatted_name(first_name, last_name):
   full_name = first_name + ' ' + last_name
   return full_name.title()

Функция Formattated_name () занимает первое и фамилию и объединяет их с пространством между с образованием полного имени. Затем он заглавят первую букву каждого слова. Чтобы убедиться, что этот код работает, вам нужно написать какой-нибудь код, который использует эту функцию. В именах .py Я напишу какой-то простой код, который позволяет пользователям ввести свои первые и фамилии:

from name_function import formatted_name

print("Please enter the first and last names or enter x to E[x]it.")

while True:
   first_name = input("Please enter the first name: ")
   if first_name == "x":
       print("Good bye.")
       break

   last_name = input("Please enter the last name: ")
   if last_name == "x":
       print("Good bye.")
       break

   result = formatted_name(first_name, last_name)
   print("Formatted name is: " + result + ".")

Этот код импортирует Formatted_name () с name_function.py и включен, позволяет пользователю вводить серию первых и фамилию и показывает форматированные полные имена.

Существует модуль в стандартной библиотеке Python, называемой Unittest, которая содержит инструменты для тестирования вашего кода. Установки для тестирования подразделений Если все определенные части поведения вашей функции являются правильными, что будет объединять их вместе с другими частями гораздо проще.

Тестовый случай – это коллекция модульных тестов, которые вместе доказывают, что функция работает как предназначена, внутри полного диапазона ситуаций, в которых эта функция может оказаться самим собой и что, как ожидается, будет работать. Тестовый случай должен учитывать все возможные виды ввода. Функция может получать от пользователей, и поэтому должна включать тесты для представления каждой из этих ситуаций.

Вот типичный сценарий для написания тестов:

Сначала вам нужно создать тестовый файл. Затем импортируйте Unittest Module, определите класс тестирования, который наследует от Unittest.Testcase и, наконец, напишите ряд методов для проверки всех случаев поведения вашей функции.

Есть линейка по очереди ниже следующего кода:

import unittest
from name_function import formatted_name

class NamesTestCase(unittest.TestCase):

   def test_first_last_name(self):
       result = formatted_name("pete", "seeger")
       self.assertEqual(result, "Pete Seeger")

Во-первых, вам необходимо импортировать Unittest и функцию, которую вы хотите проверить, Formatted_name (). Затем вы создаете класс, например, namestcase, который будет содержать тесты для функции formatted_name (). Этот класс наследуется от класса Unittest.

NameStCase содержит один метод, который тестирует одну часть форматы_name (). Вы можете вызвать этот метод test_first_last_name ().

В рамках метода теста Test_first_Last_name () вы вызываете функцию, которую вы хотите проверить, и хранить возвращаемое значение. В этом примере мы собираемся позвонить Formatted_name () с аргументами «Pete» и «Seeger» и сохранить результат в результате полученной переменной.

В последней строке мы будем использовать метод Assert. Способ ASSERT проверяет, что результат, который вы получили, соответствует результату, который вы ожидаете получить. И в этом случае мы знаем, что функция formatted_name () вернет полное имя с заглавными буквами, поэтому мы ожидаем, что результат “Пит Сейджер”. Чтобы проверить это, используется метод Unittest Assertequal ().

self.assertEqual(result, "Pete Seeger")

Эта линия в основном означает: сравните значение в полученной переменной с «Weeger» «Пит», и если они равны, все в порядке, но если они не дайте мне знать.

При запуске test_name_function.py вы должны получить нормально, что означает, что тест прошел.

Ran 1 test in 0.001s

OK

Чтобы показать вам, как выглядит неудачный тест, похоже, я собираюсь изменить функцию Formatted_name (), включая новый аргумент в среднем имени.

Поэтому я собираюсь переписать функцию, чтобы выглядеть так:

#Generate a formatted full name including a middle name
def formatted_name(first_name, last_name, middle_name):
   full_name = first_name + ' ' + middle_name + ' ' + last_name
   return full_name.title()

Эта версия formatted_name () будет работать для людей со средними именами, но когда вы проверяете его, вы увидите, что функция нарушена для людей, у которых нет среднего имени.

Поэтому, когда вы запускаете Test_Name_function .py Вы получите вывод, который выглядит что-то подобное:

Error
Traceback (most recent call last):

File "test_name_function.py", line 7, in test_first_last_name
    result = formatted_name("pete", "seeger")

TypeError: formatted_name() missing 1 required positional argument: 'middle_name'

Ran 1 test in 0.002s

FAILED (errors=1)

На выходе вы увидите информацию, которая скажет вам, что вам нужно знать, где проходит тест:

  • Первый элемент на выходе – это ошибка, сообщая вам, что хотя бы один тест в тестовом случае привел к ошибке.
  • Далее вы увидите файл и метод, в котором произошла ошибка.
  • После этого вы увидите линию, в которой произошла ошибка.
  • А какую ошибку в этом случае мы отсутствуем 1 аргумент «Middle_Name».
  • Вы также увидите количество прогонских испытаний, время, необходимое для испытаний для завершения, и текстовое сообщение, которое представляет состояние тестов с количеством произошедших ошибок.

Я видел пару программистов, которые предпочитают менять тест вместо улучшения кода – но не так. Потратьте немного больше времени, чтобы исправить проблему, так как он поможет вам лучше понять код и сэкономить время в долгосрочной перспективе.

В этом примере наша функция Formatted_name () сначала потребовала два параметра, а теперь как он переписан, требуется одно дополнительное: отчество. Добавление среднего имени нашей функции сломало желаемое поведение этого. Поскольку идея не должна вносить изменения в тесты, лучшее решение – сделать отчество необязательно.

После этого мы сделаем это, идея состоит в том, чтобы пройти тесты, когда используются первое и фамилия, например, «Pete Seeger», а также при первом, последним и средним имена используются, например «Raymond Red Redddington». Итак, давайте модифицируем код Formatted_name () еще раз:

#Generate a formatted full name including a middle name
def formatted_name(first_name, last_name, middle_name=''):
   if len(middle_name) > 0:
       full_name = first_name + ' ' + middle_name + ' ' + last_name
   else:
       full_name = first_name + ' ' + last_name
   return full_name.title()

Теперь функция должна работать на имена с именами и без среднего имени.

И убедиться, что он все еще работает с «Pete Weeger» снова запустить тест:

Ran 1 test in 0.001s

OK

Напишите новый метод в класс namestestcase, который проверит на средние имена:

import unittest
from name_function import formatted_name

class NamesTestCase(unittest.TestCase):

    def test_first_last_name(self):
        result = formatted_name("pete", "seeger")
        self.assertEqual(result, "Pete Seeger")

    def test_first_last_middle_name(self):
        result = formatted_name("raymond", "reddington", "red")
        self.assertEqual(result, "Raymond Red Reddington")

После того, как вы запустите тест, оба теста должны пройти:

Ran 2 tests in 0.001s

OK

Вы написали тесты, чтобы проверить, работает ли функция используя имена с или без среднего имени. Оставайтесь на улице для части 2, где я расскажу больше о тестировании в Python.

Спасибо за чтение! Посмотрите больше статей, как это на моем профиле FreeCodeCamp: https://www.freecodeCamp.org/news/author/goran/ и другие забавные вещи, которые я строит на моей странице GitHub: https://github.com/goranaviani.