pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)
文章目录
- 之前学习fixture的时候,其实这个功能就类似用例的前置,给用例执行前设置一些条件; 那fixture也就相当于setup的功能; 那有没有teardown的功能呢? 有,fixture里面的teardown用yield来唤醒teardown的执行。
- yield是一个关键字; yield在fixture中起到了唤起teardown的作用,同时也可以和return一样返回值; 但yield和return的区别是:return执行完成,该函数终止;yield在返回结束后,后续的代码仍可执行; 如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容; 如果测试用例抛出异常,yield后面的teardown内容还是会正常执行。
-
- # -*- coding:utf-8 -*- # 作者:NoamaNelson # 日期:2022/11/17 # 文件名称:test_myiled.py # 作用:yiled实现teardown功能 # 博客: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 ==============================
- # -*- coding:utf-8 -*- # 作者:NoamaNelson # 日期:2022/11/17 # 文件名称:test_yield_return.py # 作用:yield返回值 # 博客: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 ==============================
- # 官网例子 @pytest.fixture(scope="module") def smtp(): with smtplib.SMTP("smtp.gmail.com") as smtp: yield smtp # provide the fixture value 当函数执行遇到yield的时候,函数会停止执行,并返回yield 后值。
- 在pytest中想要做teardown的处理,除了使用带有yield的fixture函数,还可以直接添加终结器; request.addfinalizer把函数变成终结器; 如果 request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer() 的teardown内容; # -*- coding:utf-8 -*- # 作者:NoamaNelson # 日期:2022/11/17 # 文件名称:test_addfinalizer.py # 作用:request.addfinalize的使用 # 博客: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 ==============================
(8-fixture如何实现teardown功能?(yield的使用)),
(8-fixture如何实现teardown功能?(yield的使用))
- 之前学习
fixture的时候,其实这个功能就类似用例的前置,给用例执行前设置一些条件;
- 那
fixture也就相当于setup的功能;
- 那有没有
teardown的功能呢?
- 有,
fixture里面的teardown用yield来唤醒teardown的执行。
fixture的时候,其实这个功能就类似用例的前置,给用例执行前设置一些条件;fixture也就相当于setup的功能;teardown的功能呢?fixture里面的teardown用yield来唤醒teardown的执行。
yield是一个关键字;
yield在fixture中起到了唤起teardown的作用,同时也可以和return一样返回值;
- 但
yield和return的区别是:return执行完成,该函数终止;yield在返回结束后,后续的代码仍可执行;
- 如果
yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容;
- 如果测试用例抛出异常,
yield后面的teardown内容还是会正常执行。
yield是一个关键字;yield在fixture中起到了唤起teardown的作用,同时也可以和return一样返回值;yield和return的区别是:return执行完成,该函数终止;yield在返回结束后,后续的代码仍可执行;yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容;yield后面的teardown内容还是会正常执行。
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17
# 文件名称:test_myiled.py
# 作用:yiled实现teardown功能
# 博客: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 ==============================
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17
# 文件名称:test_myiled.py
# 作用:yiled实现teardown功能
# 博客: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 ==============================
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17
# 文件名称:test_yield_return.py
# 作用:yield返回值
# 博客: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 ==============================
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17
# 文件名称:test_yield_return.py
# 作用:yield返回值
# 博客: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 ==============================
# 官网例子
@pytest.fixture(scope="module")
def smtp():
with smtplib.SMTP("smtp.gmail.com") as smtp:
yield smtp # provide the fixture value
- 当函数执行遇到
yield的时候,函数会停止执行,并返回yield 后值。
# 官网例子
@pytest.fixture(scope="module")
def smtp():
with smtplib.SMTP("smtp.gmail.com") as smtp:
yield smtp # provide the fixture value
yield的时候,函数会停止执行,并返回yield 后值。
- 在pytest中想要做
teardown的处理,除了使用带有yield的fixture函数,还可以直接添加终结器;
request.addfinalizer把函数变成终结器;
- 如果
request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer() 的teardown内容;
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17
# 文件名称:test_addfinalizer.py
# 作用:request.addfinalize的使用
# 博客: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 ==============================
teardown的处理,除了使用带有yield的fixture函数,还可以直接添加终结器;request.addfinalizer把函数变成终结器;request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer() 的teardown内容;# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17
# 文件名称:test_addfinalizer.py
# 作用:request.addfinalize的使用
# 博客: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 ==============================
© 版权声明
文章版权归作者所有,未经允许请勿转载。