建设招标网官方网站电脑版,做系统简单还是网站简单,网站建设价格报价,wordpress好用1. 简介 上一篇中#xff0c;我们刚刚实现了在每个用例之前执行初始化操作#xff0c;那么用例执行完之后如需要清除数据#xff08;或还原#xff09;操作#xff0c;可以使用 yield 来实现。fixture通过scope参数控制setup级别#xff0c;既然有setup作为用例之前前的操…1. 简介 上一篇中我们刚刚实现了在每个用例之前执行初始化操作那么用例执行完之后如需要清除数据或还原操作可以使用 yield 来实现。fixture通过scope参数控制setup级别既然有setup作为用例之前前的操作用例执行完之后那肯定也有teardown操作。 这里用到fixture的teardown操作并不是独立的函数用yield关键字呼唤teardown操作。fixture的teardown操作并不是独立的函数可以用yield关键字呼唤teardown操作。 我们之前学习的都是测试用例的前置固件也就是相当于“setup”。说到这细心的你可能想到了那有没有什么方式可以表示出“teardown”这就是我们今天学习的yield和addfinalizer。
yield yield是一个关键字它不是单独存在的要写在fixtrue标记的固件中。 我们在声明的固件myfixture中加入yield关键字在它下面写测试用例执行后想要运行的代码其他有关于固件的使用没有任何差别。需要说明的一点是我们在pytest主函数中增加了一个参数“–setup-show”他会显示出固件的执行情况。 fixture里面的teardown用yield来唤醒teardown的执行 如果测试用例中的代码出现异常或者断言失败并不会影响他的固件中yield后的代码执行但是如果固件中的yield之前的代码也就是相当于setup部分的带代码出现错误或断言失败那么yield后的代码将不会再执行当然测试用例中的代码也不会执行。 我们也可以通过request.addfinalizer()的方式实现“teardown” 我们在固件中传入request参数又在固件中定义了一个内置函数最后将定义的内置函数添加到request的addfinalizer中。
2. scopefunction
当 pytest.fixture(scopefunction) 时pytest的yieId 类似unittest的teartown。每个方法函数都会执行一次
1.新建 test_function1.py文件我们看一下是不是这样的。
2.1 代码实现 2.2 参考代码
# codingutf-8
# 1.导入模块
import pytestpytest.fixture(scopefunction)
def login():print(登录成功)yieldprint(用例执行完成收尾)def test1(login):print(操作1)print(-----------------------------------------------)def test2(login):print(操作2)print(-----------------------------------------------)def test3(login):print(操作3)print(-----------------------------------------------)if __name__ __main__:pytest.main([-s, test.py])
2.3 运行结果
运行代码后控制台打印如下图的结果 从结果看出虽然test1,test2,test3三个地方都调用了login函数并且它会在每一个用例前执行一次
2.如果test1不调用,test2调用login,test3不调用运行顺序会是怎样的
2.4 参考代码
# codingutf-8
# 1.导入模块
import pytestpytest.fixture(scopefunction)
def login():print(登录成功)yieldprint(用例执行完成收尾)def test1():print(操作1)print(-----------------------------------------------)def test2(login):print(操作2)print(-----------------------------------------------)def test3():print(操作3)print(-----------------------------------------------)if __name__ __main__:pytest.main([-s, test.py])
2.5 运行结果
运行代码后控制台打印如下图的结果 从结果看出function级别的fixture在当前.py模块里只会在用例test_s2第一次调用前执行一次
3.scopemodule
1.fixture参数scope”module”module作用是整个.py文件都会生效 整个文件只会执行一次用例调用时参数写上函数名称就行
3.1 代码实现 3.2 参考代码
# codingutf-8
# 1.导入模块
import pytestpytest.fixture(scopemodule)
def login():print(登录成功)yieldprint(用例执行完成收尾)def test1(login):print(操作1)print(-----------------------------------------------)def test2(login):print(操作2)print(-----------------------------------------------)def test3(login):print(操作3)print(-----------------------------------------------)if __name__ __main__:pytest.main([-s, test_bjhg_function1.py])
3.3 运行结果
运行代码后控制台打印如下图的结果 从结果看出虽然test1,test2,test3三个地方都调用了login函数但是它只会在第一个用例前执行一次
2.如果test1不调用,test2调用login,test3不调用运行顺序会是怎样的
3.4 参考代码
# codingutf-8
# 1.导入模块
import pytestpytest.fixture(scopemodule)
def login():print(登录成功)yieldprint(用例执行完成收尾)def test1():print(操作1)print(-----------------------------------------------)def test2(login):print(操作2)print(-----------------------------------------------)def test3():print(操作3)print(-----------------------------------------------)if __name__ __main__:pytest.main([-s, test.py])
3.5 运行结果
运行代码后控制台打印如下图的结果 从结果看出module级别的fixture在当前.py模块里只会在用例test_s2第一次调用前执行一次
4. yield执行teardown 细心的童鞋或者小伙伴可以看到我前边的代码中有一个yield关键字大家有点好奇是做什么的这一小节就给你答疑解惑。其实就是用来唤醒teardown。
1.fixture里面的teardown用yield来唤醒teardown的执行
4.1 代码实现 4.2 参考代码
# codingutf-8
# 1.导入模块
import pytestpytest.fixture(scopemodule)
def login():print(登录成功)yieldprint(执行teardown!)print(用例执行完成收尾)def test1(login):print(操作1)print(-----------------------------------------------)def test2(login):print(操作2)print(-----------------------------------------------)def test3(login):print(操作3)print(-----------------------------------------------)if __name__ __main__:pytest.main([-s, test.py])
4.3 运行结果
运行代码后控制台打印如下图的结果 5. yield遇到异常
1.如果其中一个用例出现异常不影响yield后面的teardown执行,运行结果互不影响并且在用例全部执行完之后会呼唤teardown的内容
5.1 代码实现 5.2 参考代码
# codingutf-8
# 1.导入模块
import pytestpytest.fixture(scopemodule)
def login():print(登录成功)yieldprint(执行teardown!)print(用例执行完成收尾)def test1(login):print(操作1)print(-----------------------------------------------)# 如果第一个用例异常了不影响其他的用例执行raise NameError # 模拟异常def test2(login):print(操作2)print(-----------------------------------------------)def test3(login):print(操作3)print(-----------------------------------------------)if __name__ __main__:pytest.main([-s, test.py])
5.3 运行结果
运行代码后控制台打印如下图的结果 2.如果在setup就异常了那么是不会去执行yield后面的teardown内容了
3.yield也可以配合with语句使用以下是官方文档给的案例
# 官方文档案例
# content of test_yield2.pyimport smtplib
import pytestpytest.fixture(scopemodule)
def smtp():with smtplib.SMTP(smtp.gmail.com) as smtp:yield smtp # provide the fixture value
6.addfinalizer终结函数
1.除了yield可以实现teardown,在request-context对象中注册addfinalizer方法也可以实现终结函数。
# 官方案例# content of conftest.py
import smtplib
import pytestpytest.fixture(scopemodule)
def smtp_connection(request):smtp_connection smtplib.SMTP(smtp.gmail.com, 587, timeout5)def fin():print(teardown smtp_connection)smtp_connection.close()request.addfinalizer(fin)return smtp_connection # provide the fixture value
2.yield和addfinalizer方法都是在测试完成后呼叫相应的代码。但是addfinalizer不同的是 他可以注册多个终结函数。 这些终结方法总是会被执行无论在之前的setup code有没有抛出错误。这个方法对于正确关闭所有的fixture创建的资源非常便利即使其一在创建或获取时失败 参考文档pytest documentation