Тестирование функций и классов на Python
После написания функций и классов вы можете написать тесты для своего кода. Тестирование поможет проверить как работает ваша программа и быть уверенным, что у пользователей не будет проблем. Опытные программисты всегда тестируют свой код и выявляют ошибки до того, пока с ними не столкнулись другие пользователи. Тестировать код можно с помощью модуля Python unittest.
Содержание страницы: |
---|
1. Тестирование функций |
2. Тестирование классов |
3. Разные методы assert |
1. Тестирование функций в Python
Модуль unittest из стандартной библиотеки Python представляет функциональную возможность для тестирования кода. Модульный тест проверяет правильность работы одного конкретного аспекта поведения функции. Тестовый сценарий - это совокупность модульных тестов, которые совместно доказывают, что функция ведет себя правильно во всех ситуациях, которые она должна обрабатывать. Часто достаточно написать модульные тесты для критичных аспектов поведения кода.
Для проведения теста напишем простую функцию, которая запрашивает два параметра "страна и столица" и выводит в отформатированном виде:
def get_country(country, capital):
"""Возвращает отформатированную строку страна-столица."""
full_country = f"{country}-{capital}"
return full_country.title()
Для написания тестового сценария для фунции, необходимо импортировать модуль unittest. Затем создать класс, наследующий от unittest.TestCase, и написать серию методов для тестирования различных аспектов поведения функции:
import unittest
class CountryTestCase(unittest.TestCase):
"""Тесты для функции get_country """
def test_get_country(self):
"""Параметры вида 'Uk-London' работают правильно?"""
formatted_country = get_country('uk', 'london')
self.assertEqual(formatted_country, 'Uk-London')
if __name__ == '__main__':
unittest.main()
После импортирования unittest, мы создаем класс CountryTestCase, который содержит серию модульных тестов для функции get_country(). Класс наследует от класса unittest.TestCase, чтобы Python знал как запускать тесты.
Класс CountryTestCase содержит всего один метод test_get_country(), который тестирует один аспект функции get_country()- правильность форматирования строки страна-столица. Любой метод, имя которого начинается с test_, будет выполняться автоматически при запуске. В тестовом методе вызывается тестируемая функция get_country() c аргументами 'uk' и 'london' и сохраняет возвращаемое значение в переменную formatted_country.
self.assertEqual проверяет соответствует ли полученный результат функции, тому результату, который вы хотите получить. Метод assertEqual() из модуля unittest получает переменную formatted_country и строку 'Uk-London' и сравнивает их.
Блок if проверяет специальную переменную __name__, значение которой задается при выполнении программы. Если файл выполняется как главная программа, переменной __name__ будет присвоено значение __main__. В этом случае вызывается метод unittest.main(), который выполняет тестовый сценарий. В результате при запуске теста мы получим:
.
----------------------------------------------------------------------
Ran 1 test in 0.0001s
OK
Точка в начале сообщает, что один тест прошел успешно. Далее сообщается что на выполнение теста потребовалось 0.0001s. Сообщение Ок говорит о успешном прохождение теста.
В случае если результат будет не соответствовать, тому который вы хотите получить, будет выведено сведения о ошибке.
2. Тестирование классов на Python
Тестирование классов очень похоже на тестирование функции, так как приходится в классах тестировать его методы. Возьмем класс Car, который мы писали, изучая классы в 14 разделе.
class Car():
"""Описание автомобиля"""
def __init__(self, brand, model, years):
"""Инициализирует атрибуты"""
self.brand = brand
self.model = model
self.years = years
def get_full_name(self):
"""Автомобиль"""
name = f"Автомобиль {self.brand} {self.model} {self.years}"
return name.title()
def read_mileage(self):
"""Пробег автомобиля"""
print(f"Пробег автомобиля {self.mileage} км.")
Класс Car описывает автомобиль и содержит метод get_full_name(), который возвращает полное описание автомобиля. Для этого метода и напишем тест, который будет проверять правильно ли возвращается полное описание автомобиля. В тест будем использовать метод assertEqual(), который проверяет равенство.
import unittest
class TestCar(unittest.TestCase):
"""Тест для класса Car"""
def test_get_full_name(self):
"""Проверяет правильность получения полного имени"""
car_1 = Car('audi', 'a6', 2021)
self.assertEqual(car_1.get_full_name(), 'Автомобиль Audi A6 2021')
if __name__ == '__main__':
unittest.main()
В начале импортируем модуль unittest. Тестовый сценарий TestCar наследуется от класса unittest.TestCare. В тестовом методе test_get_full_name() мы создаем экземпляр класса Car и передаем ему аргументы. С помощью метода assertEqual() проверяем совпадает ли вызываемый метод в классе Car get_full_name() с теми данными, которые хотим получить. Запустив тест, мы получим результат:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
В результате тест прошел успешно.
3. Разные методы assert в Python
Класс unittest.TestCase содержит много проверочных методов assert. Эти методы проверяют выполняются ли условие в определенной точке вашего кода. В таблице перечислены основные методы assert.
Метод | Использование |
---|---|
assertEqual(a, b) | Проверяет, что a == b |
assertNotEqual(a, b) | Проверяет, что a != b |
assertTrue(x) | Проверяет, что значение x истинно |
assertFalse(x) | Проверяет, что значение x ложно |
assertIn(элемент, список) | Проверяет, что элемент входит в список |
assertNotIn(элемент, список) | Проверяет, что элемент не входит в список |
Приведем пример метода assertNotEqual() класса TestCar из предыдущего примера.
import unittest
class TestCar(unittest.TestCase):
"""Тест для класса Car"""
def test_get_full_name(self):
"""Проверяет правильность получения полного имени"""
car_1 = Car('audi', 'a6', 2021)
self.assertNotEqual(car_1.get_full_name(), 'Автомобиль Audi A6 2021')
if __name__ == '__main__':
unittest.main()
В результате запустив данный тест, мы получим ошибку, так как эти значения равны, и мы проверили это в предыдущем тесте.
F
======================================================================
FAIL: test_get_full_name (__main__.TestCar)
Проверяет правильность получения полного имени
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:test.py", line 201, in test_get_full_name
self.assertNotEqual(car_1.get_full_name(), 'Автомобиль Audi A6 2021')
AssertionError: 'Автомобиль Audi A6 2021' == 'Автомобиль Audi A6 2021'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
В описание ошибки видно, что значения равны.
Назад: Функции json. Сохранение данных Python