fixture特点
更加灵活–命名不受到之前的命名限定
更加智能–可以通过conftest.py实现自动寻找配置的能力
更好使用–可以通过装饰器模式来指定自己的作用范围
使用方式
fixture(scope=“function”, params=None, autouse=False, ids=None, name=None):
scope: 表示作用域 默认为function,可选择为 “class”, “module” or “session”.
params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
autouse: 如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture
ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成
name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽;
解决这个问题的一种方法是将装饰函数命名 “fixture_ ”然后使用”@ pytest.fixture(name =‘’)“”。
运行结果:
注意:方法1和方法3都是在执行前执行了fixture内容,而方法2没有执行,这就说明了插件配置的灵活性
同样的,在此基础上,我们可以针对于整个项目来进行插件设置–fixture的conftest
新建一个conftest.py 将之前的装饰器代码放进来
然后测试代码
import pytest
def test_1(login):
print("我是test1我要登录后执行")
def test_2():
print("我是test2,我不用登录,也能执行")
def test_3(login):
print("我是test3,我要登录")
if __name__ == "__main__":
pytest.main(['-vs'])
这时候,会发现conftest的执行会变为全局的内容
fixture中的yield函数
fixtrue的装饰器可以用于我们的用例的前置执行逻辑,相应的,如果我们需要在函数执行结束之后需要去做一些其他操作,那么我们也可以进行特定的操作,如yield函数,可以帮助到我们.
代码如下:
import pytest
@pytest.fixture()
def login():
print("登录成功,账号是xiaoming")
yield
print("执行teardown操作")
print("关闭浏览器" )
看一下运行结果:
总结:
yield前的代码为前置执行逻辑
yiled为分界线,后面的代码为用例结束后执行的代码逻辑
这里的调用都是直接将方法名当做参数传入的
执行流程 – 运行测试用例 --> 发现参数为方法名 --> 寻找同名的函数方法 --> 先执行同名的函数方法 -->碰到yield --> 执行测试用例 -->执行yield后续代码
思考: 如果在执行过程中出现了异常会怎么样?
代码如下:
看下运行结果:
由此可见,异常不会影响到yield的执行,会在异常结束后继续执行yield后续的代码。
同样,我们可以思考下,在setup出现异常的时候还会执行yield后续内容吗?
看下代码:
import pytest
@pytest.fixture()
def login():
print("登录成功,账号是xiaoming")
3/0
yield
print("执行teardown操作")
print("关闭浏览器" )
看下运行结果:
当我们人为制造一个异常的时候,会发现,后续的yield不会继续执行了