pytest-addfinlizer终结函数
前言
在pytest中想要做teardown的处理,除了使用带有yield的fixture函数外,还可以添加终结器(addfinlizer),request.addfinlizer将函数变为终结函数
终结函数实现:定义fixture函数,前部分为前置setup的操作,在定义一个函数用来实现后置teardown,然后再在fixture中使用request.addfinalizer(teardown函数名),那么将这个fixture应用到测试用例中,即可实现跟yield一样的前后置效果,如果需要传参给用例,则需要return来返回
示例代码
1、终结函数的添加代码示例:
import pytest @pytest.fixture() def test_addfinalizer(request): #前置操作setup print('===打开浏览器==') test = 'test_addfinalizer' def fin(): #后置操作teardown print('==关闭浏览器==') #将fin注册为终结函数 request.addfinalizer(fin) #返回前置操作的变量 return test def test_anthor(test_addfinalizer): print('最新用例',test_addfinalizer)
输出结果:
2、fixture的yield实现后置代码
import pytest @pytest.fixture() def test_addfinalizer(): #前置操作setup print('===打开浏览器==') test = 'test_addfinalizer' yield test print('==关闭浏览器==') def test_anthor(test_addfinalizer): print('最新用例',test_addfinalizer)
输出结果:
两个打印对比可以看到,终结函数里打印确实是在测试用例执行完成后打印的,跟yield后置代码实现的效果是一样的
3、注册多个终结函数
可以支持多个终结函数注册,执行顺序:后注册的先执行,先注册的后执行
代码如下:
import pytest @pytest.fixture() def test_addfinalizer(request): #前置操作setup print('===打开浏览器==') test = 'test_addfinalizer' # yield test # print('==关闭浏览器==') def fin(): #后置操作teardown print('==关闭浏览器==') #也可以支持多个终结函数注册,执行顺序:后注册的先执行,先注册的后执行 def fin2(): print('==再次关闭浏览器==') #将fin注册为终结函数 request.addfinalizer(fin) #将fin2注册为终结函数 request.addfinalizer(fin2) #返回前置操作的变量 return test def test_anthor(test_addfinalizer): print('最新用例',test_addfinalizer)
输出结果:
4、区别
yield和addfinalizer实现的后置还是存在区别的,比如在发生异常的时候
import pytest @pytest.fixture() def log(): print('需要输入密码') yield assert 1 == 2 print('登陆成功') def test_01(log): print('test_01执行') @pytest.fixture() def test_addfinalizer(request): #前置操作setup print('===打开浏览器==') test = 'test_addfinalizer' def fin(): #后置操作teardown print('==关闭浏览器==') #也可以支持多个终结函数注册,执行顺序:后注册的先执行,先注册的后执行 def fin2(): print('==再次关闭浏览器==') #将fin注册为终结函数 request.addfinalizer(fin) #将fin2注册为终结函数 request.addfinalizer(fin2) # 除setup以外部分发生异常,仍是会继续执行addfinalizer(也就是后置代码),但测试用例代码则不会执行 assert 1 == 2 #返回前置操作的变量 return test def test_anthor(test_addfinalizer): print('最新用例',test_addfinalizer)
输出打印:
以上异常都发生在teardown部分,从打印结果分析:
1、yield:前置以及测试用例的部分打印都已输出,但后置部分异常代码后的打印并未执行
2、addfinalizer:异常发生在注册终结函数后,前、后置打印都已经输出,但测试用例的打印并未输出
总结:
yield和addfinalizer区别:
共同点:setup代码发生异常,后面部分都不执行不同点:只要addfinalizer注册成功,除setup以外部分发生异常,仍是会继续执行addfinalizer(也就是后置代码),但测试用例代码则不会执行,。而yeild后面发生异常,就不会继续执行yield异常后的代码,但测试用例代码仍会执行