Тестирование

Обновлено: 2024-03-12
2 мин

Содержание

unittest

Python поставляется со встроенным модулем для тестирования - unittest.

Пример теста:

import unittest

def square(x):
    return x * x

class TestSquare(unittest.TestCase):
    def test_positive(self):
        self.assertEqual(square(2), 4)
        self.assertEqual(square(3), 9)
        self.assertEqual(square(4), 16)

    def test_negative(self):
        self.assertEqual(square(-2), 4)
        self.assertEqual(square(-3), 9)
        self.assertEqual(square(-4), 16)

if __name__ == '__main__':
    unittest.main()

В этом примере мы создаем тестовый класс TestSquare, который наследуется от unittest.TestCase. В этом классе мы определяем два метода: test_positive и test_negative. Эти методы используют метод assertEqual для проверки ожидаемых результатов.

Метод assertEqual сравнивает два значения и генерирует исключение, если они не равны. Если тест проходит успешно, то мы не получаем никаких сообщений.

Запуск тестов можно выполнить из командной строки с помощью следующей команды:

python test_square.py

Да, в модуле unittest есть возможность делать моки с помощью встроенного класса unittest.mock.Mock. Это позволяет заменить реальный объект на имитацию, чтобы упростить тестирование и избежать внешних зависимостей.

Вот пример, который демонстрирует, как можно использовать моки в unittest для тестирования функции, которая зависит от внешнего сервиса:

from unittest import TestCase, mock

def get_external_data():
    # Это внешний сервис, который может вернуть много данных
    # Но для тестирования нас интересует только первый элемент
    return ['data1', 'data2', 'data3']

def process_data():
    data = get_external_data()
    return data[0]

class TestProcessData(TestCase):

    @mock.patch('__main__.get_external_data')
    def test_process_data(self, mock_get_external_data):
        mock_get_external_data.return_value = ['test_data1', 'test_data2', 'test_data3']
        result = process_data()
        self.assertEqual(result, 'test_data1')

Здесь мы используем декоратор @mock.patch для замены реального get_external_data на имитацию. В тесте мы устанавливаем возвращаемое значение имитации и проверяем, что функция process_data вернула ожидаемый результат.

Ресурсы: