Как реализовать настройку в стиле 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 интегрированы с механизмом приспособлений и подчиняются соответствующим правилам области видимости приспособлений, участвующих в вызове.