网站首页 > 技术教程 正文
书籍来源:房荔枝 梁丽丽《pytest框架与自动化测试应用》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:pytest框架进阶自学系列 | 汇总_热爱编程的通信人的博客-CSDN博客
使用yield代替return
已经可以将测试方法前要执行的或依赖的问题解决了,但测试方法后需要销毁并清除的数据该如何处理呢?范围是模块级别的,类似setupClass。解决方法是通过在同一模块中加入yield关键字,yield调用第一次返回结果,第二次执行它下面的语句并返回结果。
步骤如下:
(1)添加@pytest.fixture(scope=module)语句。
(2)在登录的方法中添加yield,之后添加销毁清除的步骤。
代码如下:
import pytest
@pytest.fixture(scope="module")
def open():
print("打开浏览器,打开百度首页")
yield
print("执行teardown")
print("最后关闭浏览器")
def test_s7():
print("用例7,")
def test_s8():
print("用例8,")
def test_s9(open):
print("用例9,")D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_fixture_module_yield.py
Testing started at 11:27 ...
Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_fixture_module_yield.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-3
============================= test session starts =============================
platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-book
collecting ... collected 3 items
test_fixture_module_yield.py::test_s7 PASSED [ 33%]用例7,
test_fixture_module_yield.py::test_s8 打开浏览器,打开百度首页
PASSED [ 66%]用例8,
test_fixture_module_yield.py::test_s9 PASSED [100%]用例9,
执行teardown
最后关闭浏览器
============================== 3 passed in 0.02s ==============================
Process finished with exit code 0
使用with写法
对于支持with写法的对象,程序也可以隐式地执行它的清理销毁操作。当使用with出现问题时,由Python进行处理以便销毁。
代码如下:
import pytest
@pytest.fixture(scope="module")
def open():
print("打开浏览器,打开百度首页")
yield
print("执行teardown")
print("最后关闭浏览器")
def test_s7():
print("用例7,")
def test_s8():
print("用例8,")
def test_s9(open):
print("用例9,")D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_fixture_module_yield.py
Testing started at 11:27 ...
Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_fixture_module_yield.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-3
============================= test session starts =============================
platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-book
collecting ... collected 3 items
test_fixture_module_yield.py::test_s7 PASSED [ 33%]用例7,
test_fixture_module_yield.py::test_s8 打开浏览器,打开百度首页
PASSED [ 66%]用例8,
test_fixture_module_yield.py::test_s9 PASSED [100%]用例9,
执行teardown
最后关闭浏览器
============================== 3 passed in 0.02s ==============================
Process finished with exit code 0
使用addfinalizer方法
fixture函数能够接收一个request参数,表示测试请求的上下文。本书使用request.addfinalizer方法为fixture添加清理销毁函数。
代码如下:
import pytest
@pytest.fixture()
def demo_fixture(request):
print("\n这个fixture在每个用例前执行一次")
def demo_finalizer():
print("\n在每个用例完成后执行的teardown")
request.addfinalizer(demo_finalizer)
def test_01(demo_fixture):
print("\n===执行了用例:test_01===")
def test_02(demo_fixture):
print("\n===执行了用例:test_02===")
def test_03(demo_fixture):
print("\n===执行了用例:test_03===")D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_addfinalizer.py
Testing started at 11:50 ...
Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_addfinalizer.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-3
============================= test session starts =============================
platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-book
collecting ... collected 3 items
test_addfinalizer.py::test_01
这个fixture在每个用例前执行一次
PASSED [ 33%]
===执行了用例:test_01===
在每个用例完成后执行的teardown
test_addfinalizer.py::test_02
这个fixture在每个用例前执行一次
PASSED [ 66%]
===执行了用例:test_02===
在每个用例完成后执行的teardown
test_addfinalizer.py::test_03
这个fixture在每个用例前执行一次
PASSED [100%]
===执行了用例:test_03===
在每个用例完成后执行的teardown
============================== 3 passed in 0.03s ==============================
Process finished with exit code 0
注意:如果在yield之前或者addfinalizer注册之前代码发生错误并退出,则不会再执行后续的清理操作。
yield与addfinalizer的区别
那么,除了在使用上的区别之外,yield与addfinalizer还有什么不同呢?
addfinalizer可以注册多个终结销毁函数,而yield无法实现多个。在执行yield的过程中出现错误无法再执行yield后面的函数,而addfinalizer函数在执行的过程中即使出错也会执行后面的函数。
代码如下:
import pytest
@pytest.fixture()
def demo_fixture(request):
print("\n这个fixture在每个用例前执行一次")
def demo_finalizer():
print("\n在每个用例完成后执行的teardown")
def demo_finalizer2():
print("\n在每个用例完成后执行的teardown2")
def demo_finalizer3():
print("\n在每个用例完成后执行的teardown3")
request.addfinalizer(demo_finalizer)
request.addfinalizer(demo_finalizer2)
request.addfinalizer(demo_finalizer3)
def test_01(demo_fixture):
print("\n===执行了用例:test_01===")
def test_02(demo_fixture):
print("\n===执行了用例:test_02===")
def test_03(demo_fixture):
print("\n===执行了用例:test_03===")运行结果如图所示,可以看到,注册的3个函数都被执行了,但是要注意执行顺序,可以看出与注册的顺序恰好相反。
D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_addfinalizer02.py
Testing started at 10:47 ...
Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_addfinalizer02.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-3
============================= test session starts =============================
platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-book
collecting ... collected 3 items
test_addfinalizer02.py::test_01
这个fixture在每个用例前执行一次
PASSED [ 33%]
===执行了用例:test_01===
在每个用例完成后执行的teardown3
在每个用例完成后执行的teardown2
在每个用例完成后执行的teardown
test_addfinalizer02.py::test_02
这个fixture在每个用例前执行一次
PASSED [ 66%]
===执行了用例:test_02===
在每个用例完成后执行的teardown3
在每个用例完成后执行的teardown2
在每个用例完成后执行的teardown
test_addfinalizer02.py::test_03
这个fixture在每个用例前执行一次
PASSED [100%]
===执行了用例:test_03===
在每个用例完成后执行的teardown3
在每个用例完成后执行的teardown2
在每个用例完成后执行的teardown
============================== 3 passed in 0.02s ==============================
Process finished with exit code 0
当setUp的代码执行出错时,addfinalizer依旧会被执行。
猜你喜欢
- 2024-11-17 这些年,英国女王就靠这件事赚了6000多万元!
- 2024-11-17 主题分类词汇 14 (Industry 工业)
- 2024-11-17 工件的安装与夹具,建议收藏
- 2024-11-17 Pytest fixture及conftest详解
- 2024-11-17 pytest框架进阶自学系列 | 在不同的层级上重写fixture
- 2024-11-17 仕诺康丨全程导板工具盒
- 2024-11-17 Pytest的内置fixture(七)
- 2024-11-17 你会买吗?可以边走边玩的Switch专用手柄支架Fixture S1开启众筹
- 2024-11-17 思林杰获得外观设计专利授权:“充电座(BBUChargingFixture)”
- 2024-11-17 软件测试 | pytest测试框架纸fixture进阶
欢迎 你 发表评论:
- 10-23Excel计算工龄和年份之差_excel算工龄的公式year
- 10-23Excel YEARFRAC函数:时间的"年份比例尺"详解
- 10-23最常用的10个Excel函数,中文解读,动图演示,易学易用
- 10-23EXCEL中如何计算截止到今日(两个时间中)的时间
- 10-2390%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 10-23计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- 10-23Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 10-23怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- 最近发表
-
- Excel计算工龄和年份之差_excel算工龄的公式year
- Excel YEARFRAC函数:时间的"年份比例尺"详解
- 最常用的10个Excel函数,中文解读,动图演示,易学易用
- EXCEL中如何计算截止到今日(两个时间中)的时间
- 90%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- Excel日期函数之DATEDIF函数_excel函数datedif在哪里
- Excel函数-DATEDIF求司龄_exceldatedif函数计算年龄
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)

本文暂时没有评论,来添加一个吧(●'◡'●)