(8-fixture如何实现teardown功能?(yield的使用))
1引入
- 之前学习fixture的时候,其实这个功能就类似用例的前置,给用例执行前设置一些条件;
- 那fixture也就相当于setup的功能;
- 那有没有teardown的功能呢?
- 有,fixture里面的teardown用yield来唤醒teardown的执行。
2 yield说明
- yield是一个关键字;
- yield在- fixture中起到了唤起- teardown的作用,同时也可以和- return一样返回值;
- 但yield和return的区别是:return执行完成,该函数终止;yield在返回结束后,后续的代码仍可执行;
- 如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容;
- 如果测试用例抛出异常,yield后面的teardown内容还是会正常执行。
3 yield的使用
3.1 实现teardown
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_myiled.py
# 作用:yiled实现teardown功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson
import pytest
@pytest.fixture(scope="module")
def start():
    print("打开浏览器,输入账号和密码")
    yield
    print("关闭浏览器")
def test_o(start):
    print("执行用例11111")
def test_t(start):
    print("执行用例22222")
if __name__ == '__main__':
    pytest.main(["-s", "test_myiled.py"])
test_myiled.py::test_o                     打开浏览器,输入账号和密码
PASSED                                     [ 50%]执行用例11111
test_myiled.py::test_t PASSED              [100%]执行用例22222
										   关闭浏览器
============================== 2 passed in 0.03s ==============================
3.2 yield返回值
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_yield_return.py
# 作用:yield返回值
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson
import pytest
@pytest.fixture(scope="session")
def start():
    print("打开浏览器")
    num = "测试yield返回值"
    yield num
    print("关闭浏览器")
@pytest.fixture()
def login(start):
    print("输入网址,用户名和密码")
    name = "NoamaNelson"
    password = "123456"
    yield name, password
    print("登陆成功")
def test_case(login):
    print("开始执行用例")
    name1, password1 = login
    print(name1, password1)
    assert "NoamaNelson" in name1
    assert "123456" in password1
if __name__ == '__main__':
    pytest.main(["-s", "test_yield_return.py"])
test_yield_return.py::test_case        打开浏览器
                                	   输入网址,用户名和密码
PASSED                                 [100%]开始执行用例
                                       NoamaNelson 123456
                                       登陆成功
                                       关闭浏览器
============================== 1 passed in 0.02s ==============================
4 yield+with
# 官网例子
@pytest.fixture(scope="module")
def smtp():
    with smtplib.SMTP("smtp.gmail.com") as smtp:
        yield smtp # provide the fixture value
- 当函数执行遇到yield的时候,函数会停止执行,并返回yield后值。
5 addfinalizer 终结函数
- 在pytest中想要做teardown的处理,除了使用带有yield的fixture函数,还可以直接添加终结器;
- request.addfinalizer把函数变成终结器;
- 如果 request.addfinalizer()前面的代码,即setup部分已经抛出异常了,则不会执行request.addfinalizer()的teardown内容;
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_addfinalizer.py
# 作用:request.addfinalize的使用
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson
import pytest
@pytest.fixture(scope="module")
def test_addfinalizer(request):
    # 前置操作setup
    print("打开浏览器")
    test = "test_addfinalizer"
    def tear():
        # 后置操作teardown
        print("关闭浏览器")
    request.addfinalizer(tear)
    # 返回前置操作的变量
    return test
def test_case(test_addfinalizer):
    print("测试用例")
if __name__ == "__main__":
    pytest.main(["-s", "test_addfinalizer.py"])
test_addfinalizer.py::test_anthor      打开浏览器
PASSED                                 [100%]测试用例
                                       关闭浏览器
============================== 1 passed in 0.02s ==============================










