setup,每个测试用例执行前要进行的处理。
teardown,每个测试用例执行结束后要进行的处理。
python3.9中新版本改为setup_method\teardown_method
import pytest
class TestMyProject:
def setup(self):
print("每个测试用例执行前的初始化")
def test_001(self):
print("测试用例1")
def test_002(self):
print("测试用例2")
def teardown(self):
print("每个测试用例执行结束后的收尾")
setup_class/teardown_class
每个测试类初始化前后的操作,如创建日志对象,连接数据库等操作。
class TestMyProject:
def setup_class(self):
# 如连接数据库
print("测试类初始化前的操作")
def setup(self):
print("每个测试用例执行前的初始化")
def test_001(self):
print("测试用例1")
def test_002(self):
print("测试用例2")
def teardown(self):
print("每个测试用例执行结束后的收尾")
def teardown_class(self):
# 如关闭数据库
print("测试类执行后的操作")
实现全部或者部分测试用例的前后置处理。
结构及参数
:
# scope 被标记方法的作用域(函数、类、模块、包)
# params 被标记方法的参数化
# autouse 是否自动使用
# name 别名
@pytest.fixture(scope, params, autouse, ids, name)
def my_func():
print("前置操作")
# yield分割前后置操作
yield
print("后置操作")
autouse=False
:
非自动使用时,要将my_func传入指定的测试用例(谁需要传给谁);
自动使用且scope="function"时, 将my_func前后置操作用于所有的测试用例。
scope="class"时(autouse=True),每个测试类执行前后置操作。
scope="module"时(autouse=True),每个模块中,执行一次前后置操作。
# 定义夹具操作
@pytest.fixture(scope="function", autouse=False, name="别名")
def my_func():
print("前置操作")
# yield分割前后置操作
yield
print("后置操作")
class TestMyProject:
def test_001(self, my_func):
# 仅001测试用例有前后置操作,非自动使用要传入
print("测试用例1")
def test_002(self):
# 没有前后置操作
print("测试用例2")
params
参数使用:
可以给被fixture装饰的函数传入参数。
类型为list/tuple、字典组成的列表&元组
import pytest
import time
params = [
{#每个字典为一组参数,用例执行一次
"name": "jack",
"age": 23
}, {
"name": "lucy",
"age": 18
}]
# 夹具操作
# ids 设置每个参数的变量名
@pytest.fixture(scope="function", params=params, ids=["dict_1", "dict_2"], autouse=False, name="func_lauf")
def func(request): # 参数必须使用request且调用param属性拿到参数值
print("前置操作...")
yield request.param # 抛出值后执行外部函数体;外部执行结束再执行yield后面的部分
print("前置操作...")
class TestWebClass:
# 部分测试用例使用夹具,传入函数的返回值
# 变量必须与函数别名相同(无别名则用函数名)
def test_001(self, func_lauf): # func_lauf 为夹具别名,执行时传入夹具的返回值
print("test 001 成功")
print("********** 夹具返回值:", func_lauf)
def test_002(self):
time.sleep(3)
assert 1 == 1