Pytest+Selenium自动化测试:失败自动截图集成Allure报告

下面这篇笔记可以直接发布到 CSDN,内容包含了你的代码、运行命令、结果和详细讲解。


Pytest + Selenium 自动化测试:失败自动截图并集成 Allure 报告

前言

在 UI 自动化测试中,测试失败时如果能自动截图并附加到报告里,会极大提高问题排查效率。

本文将演示如何使用 Pytest + Selenium + Allure 实现这一功能,并通过一个"商品新增"的测试用例来展示完整流程。

环境准备

  • Python 3.x
  • Selenium
  • Pytest + pytest-order(控制用例执行顺序)
  • allure-pytest 插件
  • 项目已有 utils.py、页面对象等(根据你实际项目调整)

安装依赖:

bash 复制代码
pip install selenium pytest allure-pytest pytest-order

完整测试代码

以下代码位于 script/admin/test_goods.py,用于在已登录的后台系统中新增商品,并故意断言一个不存在的文本,模拟失败场景。

python 复制代码
import time
import allure
import pytest

# 导入附件类型,用于告诉 Allure 截图是 PNG 格式
from allure_commons.types import AttachmentType

from config import BASE_PATH
from script.admin.admin_home import HomePage
from script.admin.admin_goods import GoodsPage
from utils import DriverUtils, el_is_exist_by_text


@pytest.mark.run(order=3)  # 在登录之后执行
class TestAddGoods:
    def setup_class(self):
        # 获取已由 test_login 打开并登录的浏览器驱动
        self.driver = DriverUtils.get_admin_driver()

    def teardown_class(self):
        # 不关闭浏览器,留待 test_end 统一关闭
        print("⏳ 商品新增用例执行完毕,等待 test_end 关闭浏览器")

    def test_add_goods(self):
        # 1. 进入商品管理页面(此时浏览器应已处于后台首页)
        HomePage().to_goods_page()
        time.sleep(3)

        # 2. 新增商品
        goods_name = f"goods_{time.strftime('%Y%m%d%H%M%S')}"
        GoodsPage().add_goods(goods_name, "12", "13", "15", "210", "220")
        time.sleep(3)
        print("✅ 商品新增业务执行完毕")

        # 3. 故意写一个肯定不存在的文本,模拟断言失败
        try:
            # 尝试断言这个乱码文本是否在页面上
            assert el_is_exist_by_text(self.driver, "ADFDHJSGACVBSDJCGW78E") is not False

        except Exception as e:
            # ----------------- 失败时自动截图并附加到 Allure 报告 -----------------
            
            # 直接截取当前屏幕的图片,转为二进制数据
            screenshot_bytes = self.driver.get_screenshot_as_png()
            
            # 将截图附加到 Allure 测试报告中
            allure.attach(
                screenshot_bytes,
                name="失败截图_add_goods",          # 报告里显示的附件名
                attachment_type=AttachmentType.PNG  # 附件类型为 PNG
            )
            
            # 异常继续抛出,确保用例标记为失败
            raise e

控制台运行与结果

在项目根目录执行:

bash 复制代码
pytest

运行输出(部分):

复制代码
说明:
- `test_add_goods` 用例因为断言失败而报错。
- 异常被捕获后,执行了截图并附加到 Allure 报告,然后重新抛出异常,所以最终测试结果是 **FAILED**。
- 其它 3 个用例(`test_begin`、`test_login`、`test_end`)均通过。

## 生成 Allure 报告

测试完成后,使用以下命令生成 HTML 报告:
```bash
allure generate report -o report/html --clean
  • report 是存放原始 allure 结果数据的目录(默认 Pytest 会生成到此)。
  • -o report/html 指定输出 HTML 报告的路径。
  • --clean 表示每次生成前清空旧的报告。

运行后提示:

复制代码
Report successfully generated to report\html

查看报告

在本地查看报告:

bash 复制代码
allure open report/html

浏览器会自动打开报告,在失败用例详情中可以看到我们附加的 失败截图_add_goods,直接点击即可查看失败时的页面。

(实际运行时会显示你的截图)

关键点解析

  1. allure.attach 的正确用法

    • 第一个参数:二进制数据(这里用 driver.get_screenshot_as_png() 直接获得)。
    • name:附件显示名称。
    • attachment_type:需从 allure_commons.types 导入 AttachmentType。
  2. 断言函数 el_is_exist_by_text

    这是项目自定义的工具函数,用于查找指定文本的元素是否存在。

    若未找到则返回 False,因此用 is not False 来断言元素存在。

  3. 异常处理与截图时机

    在 except 块中截图并附加,然后再 raise e。这样既保留了测试失败的正确状态,又成功添加了证据。

总结

通过本文的示例,你可以在自己的 Pytest 自动化框架中轻松集成失败自动截图和 Allure 报告。

这样一来,每次测试失败都能快速定位问题界面,大大提升测试维护效率。


提示 :如果你的 Allure 报告没有显示附件,请检查 pytest.ini 中是否添加了 --alluredir 参数,或命令行运行时指定了 --alluredir=report。


如果这篇文章对你有帮助,欢迎点赞、收藏、关注~

有问题欢迎评论区交流讨论!

相关推荐
把头塞进显示器4 天前
电商平台-测试报告
python·selenium·pytest
霍格沃兹测试学院-小舟畅学5 天前
UI 测试的语义断言:Midscene aiAssert 比像素比对稳在哪、又会骗在哪
人工智能·测试工具
zuozewei5 天前
附录 A:主流工具对比选型表
人工智能·测试工具
我的xiaodoujiao5 天前
Django 基础知识详细图文教程 10-Django 模板引擎 3
后端·python·测试工具·django
霍格沃兹测试学院-小舟畅学5 天前
Google 开源 ARTEMIS:AI Agent 如何接管 Android 真机测试?
人工智能·测试工具
Liaiyang665 天前
# 自研 AST 容错初筛工具:横向评测 Django、PyTorch、TensorFlow 三大开源 Python 框架异常收容风险
python·测试工具·自动化·开源软件·代码规范·devops·代码复审
霍格沃兹测试学院-小舟畅学5 天前
我用 AI 把 Swagger 变成 500 条 pytest 用例,回归从 3 天到 3 小时
人工智能·测试工具
奔跑中的小象6 天前
GuideLLM 压测实战指南:给大模型推理服务做一次完整 SLA 评估
测试工具·guidellm
cpolar技术支持6 天前
本地 Playwright 测试报告怎么远程复盘?Trace Viewer 跑起来后,用 cpolar 分享失败现场
前端·自动化测试·测试工具·cpolar·playwright
测试狗科研平台7 天前
材料热传导能力表征——热导率计算方法与流程解析
科技·测试工具·材料工程