Модульные тесты — тесты, предназначенные для тестирования отдельного небольшого модуля(unit) нашего приложения. Не стоит путать модуль в тестировании — unit и модуля python — module. В качестве модуля может выступать функция, метод класса, небольшой класс.

Интеграционные тесты — тесты, предназначенные для тестирования взаимодействия нескольких модулей.

Базовые понятия в тестах:

  • Test fixture — подготовка данных, необходимых для выполнения одного или нескольких тестов, а также очистка «мусора» после выполнения тестов.
  • Test case(тестовый случай) — объект, позволяющий протестировать одну определенную операцию (последовательность шагов, условий и параметров, необходимых для проверки тестируемой функции).
  • Test suite(тестовый набор) — набор тестов, позволяющих всесторонне протестировать определенный функционал. Кроме тестов, может содержать общие для набора правила подготовки данных для тестирования.
  • Test runner — компонент, организующий запускающий наши тесты и предоставляющий результаты.

Структура теста:

def test_case(self, *params):
    # prepare test
    # perform action
    # assert results

Структура тестов unittest

import unittest

class TestSuite(unittest.TestCase):

  # Выполняется перед запускомтестов, содержащихся в классе
  def setUpClass(self):
    pass

  # Выполняется перед запуском каждого теста в классе
  def setUp(self):
    pass

  # Выполняется после выполнения каждого теста в классе
  def tearDown(self):
    pass

  # Выполняется после выполнения всех тестов в классе
  def tearDownClass(self):
    pass

  def test_my_test(self):
    # Test Case
    pass

Вспомогательные библиотеки

DDT

DDT (Data-Driven Tests) — фреймворк, предназначенный для параметризацией тестов.

Часто нам необходимо выполнить одни и те же шаги для различных данных. В таком случае мы можем использовать ddt. (https://ddt.readthedocs.io/en/latest/).

@ddt.ddt  # Декорирует класс для дальнейшего использования DDT
@ddt.data(*values)  # Позволяет параметризовать тест
@ddt.unpack  # Распаковывает параметры для параметризации  

Nose

Для запуска тестов, написанных в unittest, в качестве раннера часто используют nose.

nosetests -s tests  # запуск всех тестов в заданной папке.
nosetests -s tests/test_simple.py  # Запуск всех тестов в модуле. 
nosetests -s tests/test_simple.py:TestSimple  # запуск всех тестов в классе
nosetests -s tests/test_simple.py:TestSimple.test_bad_nums  # запуск конкретного теста.
nosetests -s tests --with-coverage --cover-erase  # запуск с подсчетом покрытия.

# Позволяет исключить из подсчета покрытия библиотеки
nosetests -s tests --with-coverage --cover-erase --cover-package=./data-src  # запуск с подсчетом покрытия только модулей в заданном 'package'

Подпишитесь на рассылку

Если это было вам полезно — вы можете сказать нам спасибо!