Как реализовать настройку в стиле xunit

В этом разделе описывается классический и популярный способ реализации фикстур (установки и снятия тестового состояния) на основе каждого модуля/класса/функции.

Примечание

Хотя эти методы установки/исчезновения просты и знакомы тем, кто работает с unittest или nose, вы также можете рассмотреть возможность использования более мощного механизма fixture mechanism pytest, который использует концепцию инъекции зависимостей, позволяя более модульный и более масштабируемый подход к управлению состоянием тестов, особенно для больших проектов и функционального тестирования. Вы можете смешивать оба механизма фиксации в одном файле, но тестовые методы подклассов unittest.TestCase не могут получать аргументы фиксации.

Настройка/исправление на уровне модуля

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

def setup_module(module):
    """setup any state specific to the execution of the given module."""


def teardown_module(module):
    """teardown any state that was previously setup with a setup_module
    method.
    """

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

Настройка/разгрузка на уровне класса

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

@classmethod
def setup_class(cls):
    """setup any state specific to the execution of the given class (which
    usually contains tests).
    """


@classmethod
def teardown_class(cls):
    """teardown any state that was previously setup with a call to
    setup_class.
    """

Настройка/исправление на уровне методов и функций

Аналогично, следующие методы вызываются после каждого вызова метода:

def setup_method(self, method):
    """setup any state tied to the execution of the given method in a
    class.  setup_method is invoked for every test method of a class.
    """


def teardown_method(self, method):
    """teardown any state that was previously setup with a setup_method
    call.
    """

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

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

def setup_function(function):
    """setup any state tied to the execution of the given function.
    Invoked for every test function in the module.
    """


def teardown_function(function):
    """teardown any state that was previously setup with a setup_function
    call.
    """

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

Примечания:

  • Возможно, что пары установки/выключения будут вызываться несколько раз в процессе тестирования.

  • функции разрушения не вызываются, если соответствующая функция установки существовала и была провалена/пропущена.

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

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

Вернуться на верх