setup和teardown函数
- pytest中有分别针对模块、类、函数的setup和teardown,分别在执行模块、类、函数之前和之后运行
- pytest提供的这些方法名称都是固定的
函数级别
-
setup_function()和teardown_function()函数定义在类外,会对test开头的非类方法生效
-
作用域单个测试用例,每次在单个用例执行前后都执行
import pytest
def setup_function():
print("setup_function(): 每个方法之前执行")
def teardown_function():
print("teardown_function(): 每个方法之后执行")
def test_01():
print("正在执行test1")
def test_02():
print("正在执行test2")
class TestClass(object):
def test_03(self):
print("正在执行 类方法 test3")
def normal_func():
print("正在执行normal_func")
运行结果如下:
plugins: tavern-1.16.3, openfiles-0.3.2, arraydiff-0.3, allure-pytest-2.9.45, doctestplus-0.3.0, remotedata-0.3.1
collected 3 items
pytest_code2.py setup_function(): 每个方法之前执行
正在执行test1
.teardown_function(): 每个方法之后执行
setup_function(): 每个方法之前执行
正在执行test2
.teardown_function(): 每个方法之后执行
正在执行 类方法 test3
.
==================================================================== 3 passed in 0.03s ====================================================================
类级别
-
必须在类中定义,只作用于本类
-
setup_class 和 teardown_class 会在在类执行前后执行一次
-
setup_method 和 teardown_method 会在每个测试方法前后执行一次
import pytest
class TestMethod(object):
@classmethod
def setup_class(cls):
print("setup_class(self):每个类之前执行一次")
@classmethod
def teardown_class(cls):
print("teardown_class(self):每个类之后执行一次")
def setup_method(self):
print("setup_method(self):在每个方法之前执行")
def teardown_method(self):
print("teardown_method(self):在每个方法之后执行\n")
def test_01(self):
print("正在执行test1")
def test_02(self):
print("正在执行test2")
def normal_func(self):
print("正在执行normal_func")
运行结果如下:
plugins: tavern-1.16.3, openfiles-0.3.2, arraydiff-0.3, allure-pytest-2.9.45, doctestplus-0.3.0, remotedata-0.3.1
collected 2 items
pytest_code3.py setup_class(self):每个类之前执行一次
setup_method(self):在每个方法之前执行
正在执行test1
.teardown_method(self):在每个方法之后执行
setup_method(self):在每个方法之前执行
正在执行test2
.teardown_method(self):在每个方法之后执行
teardown_class(self):每个类之后执行一次
==================================================================== 2 passed in 0.03s ====================================================================
模块级别
-
定义在类外,作用域本模块
-
setup_module 和 teardown_module 会模块内只执行一次,和函数级别,类级别不冲突
import pytest
def setup_module():
print("setup_module():在模块最之前执行")
def teardown_module():
print("teardown_module:在模块之后执行")
def setup_function():
print("setup_function():每个方法之前执行")
def teardown_function():
print("teardown_function():每个方法之后执行")
def test_outside_1():
print('正在执行test_outside_1')
def test_outside_2():
print('正在执行test_outside_2')
class TestMethod(object):
@classmethod
def setup_class(cls):
print("setup_class(self):每个类之前执行一次")
@classmethod
def teardown_class(cls):
print("teardown_class(self):每个类之后执行一次")
def setup_method(self):
print("setup_method(self):在每个方法之前执行")
def teardown_method(self):
print("teardown_method(self):在每个方法之后执行\n")
def test_01(self):
print("正在执行test1")
def test_02(self):
print("正在执行test2")
def normal_func(self):
print("正在执行normal_func")
运行结果如下:
plugins: tavern-1.16.3, openfiles-0.3.2, arraydiff-0.3, allure-pytest-2.9.45, doctestplus-0.3.0, remotedata-0.3.1
collected 4 items
pytest_code4.py setup_module():在模块最之前执行
setup_function():每个方法之前执行
正在执行test_outside_1
.teardown_function():每个方法之后执行
setup_function():每个方法之前执行
正在执行test_outside_2
.teardown_function():每个方法之后执行
setup_class(self):每个类之前执行一次
setup_method(self):在每个方法之前执行
正在执行test1
.teardown_method(self):在每个方法之后执行
setup_method(self):在每个方法之前执行
正在执行test2
.teardown_method(self):在每个方法之后执行
teardown_class(self):每个类之后执行一次
teardown_module:在模块之后执行
==================================================================== 4 passed in 0.03s ====================================================================
小结
- 若用例没被执行或失败,则不会执行teardown
- 对非test开头的函数不生效
- setup_module()
--- 在当前模块运行之前执行,必须定义在类外 - teardown_module()
--- 在当前模块运行的最后执行,必须定义在类外 - setup_class(self)
--- 所有类方法运行之前执行一次,必须在类中定义,只作用于本类 - teardown_class(self)
--- 所有类方法运行之后执行一次,必须在类中定义,只作用于本类 - setup_method(self)
--- 在每个类方法运行之前执行,必须定义在类中,只作用于本类 - teardown_method(self)
--- 在每个类方法运行之后执行,必须定义在类中,只作用于本类 - setup_function()
--- 会在每个方法之前执行,对类方法不生效,对非test开头的函数不生效,必须定义在类外 - teardown_function()
--- 会在每个方法之后执行,对类方法不生效,对非test开头的函数不生效,必须定义在类外
网友评论