Pytest 中装饰器可以实现测试用例参数化,类似 unittest 中的DDT。
语法:@pytest.mark.parametrize(‘参数名’,list)
import pytest
class TestLogin:
login_err_data = [{'name':'kaishui','pwd':''},
{'name':'','pwd':'123'}]
@pytest.mark.parametrize('login_data', self.login_err_data)
def test_login_err(self, login_data ):
# 调用登录方法,将用户名和密码传入
res = login_page.login(login_data['name'],login_data['pwd'])
# 验证是否登录成功
assert res == '登录成功'
可以看出,pytest.mark.parametrize将列表login_err_data中的每个元素都赋值到变量login_data中。
该装饰器与ddt的区别是自动拆包了。
import pytest
@pytest.fixture()
def case_fixture():
# 前置条件
username = 'kaishui'
pwd = '123'
print('这是用例的前置条件')
yield username,pwd
# 后置条件
print('这是用例的后置条件')
class TestLogin:
def test_login_err(self, case_fixture):
# 声明name,pwd变量用来接收前置条件传来的参数
name , pwd = case_fixture
# 调用登录方法,将用户名和密码传入
res = login_page.login(name,pwd)
# 验证是否登录成功
assert res == '登录成功'
@pytest.fixture():用来声明该方法是前置、后置方法;
yield:写在fixture方法中,用来区别前置条件和后置条件,并且能够return前置条件中的相关数据
用例前置后置条件的调用:直接在测试用例的参数中写入前置后置方法名。
用例前置后置条件的参数接收:直接拆包接收即可。
import pytest
@pytest.fixture(scope='class')
def class_fixture():
# 前置条件
print('这是类的前置条件')
yield
# 后置条件
print('这是类的后置条件')
class TestLogin:
def test_login_err(self, class_fixture):
# 调用登录方法,将用户名和密码传入
res = login_page.login(name,pwd)
# 验证是否登录成功
assert res == '登录成功'
对比用例的前置后置条件,类只需要在后面加上**(scope=‘class’)** 即可。
只要在一个用例参数中写了类前置后置方法名,在执行时,该类就会调用该方法,且只调用一次。
@pytest.fixture(scope='module',autouse=True)
def module_fixture():
# 前置条件
print('这是模块的前置条件')
yield
# 后置条件
print('这是模块的后置条件')
对比类的前置后置条件,将scope的值换成了module。
autouse=True: 代表不需要在模块中指定是否需要使用前置后置条件,所有的模块都会自动使用模块前置后置条件。
@pytest.fixture(scope='session',autouse=True)
def module_fixture():
# 前置条件
print('这是程序的前置条件')
yield
# 后置条件
print('这是程序的后置条件')
session 的前置后置条件在每一次程序中只会执行一次,即最外层的前置后置。