Классический «setup» в стиле xunit

Этот раздел описывает популярный классический способ реализации фикстур («setup/teardown» методов) на уровнях модулей/классов/функций.

Примечание

Поскольку эти методы просты и хорошо знакомы тем, кто уже использовал unittest or nose background, вы также можете рассмотреть применение более мощного механизма фикстур, который использует концепцию внедрения зависимостей, позволяя создавать более модальные и масштабируемые тесты, что особенно важно в больших проектах или при функциональном тестировании. В одном и том же файле можно использовать оба механизма, однако нужно иметь в виду, что подклассы unittest.TestCase не способны принимать аргументы-фикстуры.

«setup/teardown» для модуля

Если у вас есть несколько тестовых функций и классов в отдельном модуле, вы можете реализовать следующие методы-фикстуры, которые будут вызываться только один раз для всех функций модуля:

def setup_module(module):
    """настройка любых состояний, специфичных для выполнения этого модуля """


def teardown_module(module):
    """ очистка любых состояний, настроенных ранее с помощью метода
        setup_module
    """

Начиная с pytest-3.0, параметр module можно не указывать

«setup/teardown» для класса

Аналогичные методы существуют и на уровне класса - они будут вызваны до и после всех тестовых методов класса:

@classmethod
def setup_class(cls):
    """ настройка любых состояний, специфичных для выполнения этого класса (который
    обычно содержит тесты).
    """


@classmethod
def teardown_class(cls):
   """ очистка любых состояний, настроенных ранее с помощью метода
       setup_class.
   """

«setup/teardown» для функций и методов

Аналогично, следующими методами можно «обернуть» каждый вызов метода класса:

def setup_method(self, method):
    """ настройка любого состояния, связанного с выполнением этого метода класса.
    setup_method вызывается для каждого метода класса.
    """


def teardown_method(self, method):
    """ очистка любого состояния, настроенного ранее с помощью вызова setup_method
    """

Начиная с pytest-3.0, параметр method указывать не обязательно.

Если же вы предпрочитаете определять тестовые функции на уровне модуля (без разнесения по классам), для них тоже можно реализовать фикстуры:

def setup_function(function):
    """ настройка любого состояния, связанного с выполнением данной функции.
    Вызывается для каждой тестовой функции модуля.
    """


def teardown_function(function):
    """ очистка любого состояния, настроенного ранее с помощью вызова setup_function
    """

Начиная с pytest-3.0, параметр function указывать не обязательно.

Замечания:

  • Пары «setup/teardown» во время тестирования могут вызываться многократно.

  • Функция «teardown» не будет вызвана, если соответствующая «setup» функция существует, но была пропущена или выдала ошибку.

  • Вплоть до pytest-4.2, для функций в стиле xunit не соблюдались правила задания области действия фикстур, поэтому, к примеру, могло случаться так, что setup_method вызывался до autouse фикстуры уровня сессии.

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