UI自动化测试-用例执行失败时自动截图
前言:最近在学习巩固一些pytest+selenium的测试框架中的知识点,把学习过程中一些常用的操作做一下分享。
刚开始学习的时候,这个问题困扰了我很久,网上找了很多方法,最后发现实现的效果都不太理想。所以今天分享下如何实现用例失败时自动添加截图
推荐一种比较简单的实现方式,看代码:
# 用例失败添加截图
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
if rep.when == "call" and rep.failed:
with allure.step('用例失败截图'):
allure.attach(driver.get_screenshot_as_png(), "截图", allure.attachment_type.PNG)
这段代码是一个用于 pytest
测试框架的钩子函数,用于在测试用例失败时自动截取屏幕截图,并将其附加到 Allure
测试报告中。以下是对代码的详细解析:
代码解析
-
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
:- 这是一个
pytest
的钩子装饰器,用于标记一个函数为pytest
的钩子实现。 tryfirst=True
表示这个钩子函数会尽可能早地执行。hookwrapper=True
表示这个钩子函数是一个包装器,它会包裹其他钩子函数的执行。这意味着它会在其他钩子函数执行之前和之后执行。
- 这是一个
-
def pytest_runtest_makereport(item, call):
:- 这是
pytest
的一个内置钩子函数,用于在测试用例执行后生成测试报告。 item
参数表示当前的测试项(即测试用例)。call
参数表示测试用例的执行阶段(如setup
,call
,teardown
)。
- 这是
-
outcome = yield
:- 由于这是一个包装器钩子,
yield
会暂停当前函数的执行,等待被包装的钩子函数执行完毕。 outcome
是一个Result
对象,包含了被包装钩子函数的执行结果。
- 由于这是一个包装器钩子,
-
rep = outcome.get_result()
:- 从
outcome
中获取测试报告对象rep
,该对象包含了测试用例的执行结果信息。
- 从
-
if rep.when == "call" and rep.failed:
:- 检查测试用例的执行阶段是否为
call
(即测试用例的主体执行阶段),并且测试用例是否失败。 - 如果条件满足,说明测试用例在执行过程中失败了。
- 检查测试用例的执行阶段是否为
-
with allure.step('用例失败截图'):
:- 使用
Allure
的step
功能,在测试报告中添加一个步骤,描述为“用例失败截图”。 - 这个步骤会在
Allure
报告中显示为一个可展开的节点。
- 使用
-
allure.attach(driver.get_screenshot_as_png(), "截图", allure.attachment_type.PNG)
:driver.get_screenshot_as_png()
获取当前屏幕的截图,并将其作为 PNG 格式的二进制数据返回。allure.attach()
将这个截图附加到Allure
测试报告中,命名为“截图”,并指定附件类型为PNG
。
总结
这段代码的作用是:当 pytest
执行的测试用例失败时,自动截取屏幕截图,并将截图附加到 Allure
测试报告中。这样可以方便开发者在查看测试报告时,直观地看到测试失败时的界面状态,便于调试和定位问题。
需要注意的地方,此方法需要放在conftest.py下,如下图:
当用例执行失败时,会自动截图,并在allure报告中展示,见下图:
今天分享到这儿,存在不足的地方还请大家多多指教!!!