Тестирование функций и классов на Python

Установка Python 

Выбор текстового редактора 

Запуск программ Python в командной строке 

Числа и арифметические операторы Python 

Строки и функция print в Python 

Списки и кортежи в Python 

Сегментация последовательностей в Python 

Цикл for и функция range в Python 

Команда if и функция input в Python 

Словари в Python 

Множества в Python 

Цикл while в Python 

Функции в Python 

Классы в Python 

Файлы и исключения в Python 

Функции json. Сохранение данных Python 

Тестирование функций и классов на Python

Python массивы. Библиотека NumPy

После написания функций и классов вы можете написать тесты для своего кода. Тестирование поможет проверить как работает ваша программа и быть уверенным, что у пользователей не будет проблем. Опытные программисты всегда тестируют свой код и выявляют ошибки до того, пока с ними не столкнулись другие пользователи. Тестировать код можно с помощью модуля 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. 

Методы assert, представляемые модулем unittest
Метод Использование
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