ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Pytest集成Allure:打造团队真正爱看的测试报告

Pytest集成Allure:打造团队真正爱看的测试报告 做测试的都知道用例写得好是一回事结果能不能让人一眼看懂是另一回事。Pytest 本身自带的结果输出说实话比较朴素——控制台一片绿或者一片红想给领导或者开发同事看总得再解释半天。后来我把allure-pytest 插件接进项目报告从勉强能看变成了团队里真正愿意去翻的东西。这篇文章就把我从接入到产出完整报告的整个流程、踩过的坑、还有那些文档里不写的小技巧一次说清楚。这套方案要解决的痛点非常明确Pytest 执行完用例之后allure-pytest 插件会把每一步执行数据收集成 JSON 格式再由 Allure 命令行工具渲染成一个带分类、带统计、带步骤回放、带截图附件的静态 HTML 报告。不管是做接口测试、Web UI 自动化、还是移动端 Appium 测试都能用几乎没有框架限制。适合刚把 Pytest 跑通、想要进一步规范化输出测试结果的测试工程师也适合正在搭自动化平台、需要给团队统一报告口径的测试开发。1. 为什么我放弃了 pytest-html 转投 Allure1.1 多轮执行对比Allure 赢在哪市面上不是没有别的报告方案pytest-html我也用过配置简单几行代码就能出一个独立 HTML。但用久了你会发现 pytest-html 的报告是一个静态快照这一轮跑了多少条、失败几条、耗时多少看个总数还行一旦用例上百条你想按模块筛、按优先级筛、想点进去看某一步的请求参数和返回值它就非常吃力了。Allure 的底层设计不一样。它把执行过程拆成了结构化的数据模型每一条用例、每一个步骤、每一个附件都是独立存储的。所以最终渲染出来的报告可以做到按feature/story两级分组查看相当于把用例的目录结构映射到报告里每一个步骤都支持展开收起请求参数、响应体、数据库断言数据都可以挂在步骤下面失败用例自动关联截图、日志、curl 命令或任意文本内容同一份报告里带上历史执行数据能直接看成功率趋势和耗时趋势。我印象最深的一次对比一组 356 条接口用例跑完用 pytest-html 生成的报告打开要卡三秒钟搜索一个用例名就像在文本文件里 CtrlF。换成 Allure 之后同样的执行数据渲染出来页面滑动和检索都很流畅还能按 severity严重级别筛选出 P0 用例的通过情况。1.2 方案选型时我考虑的替换成本引入一个工具终究要看投入产出比。我当时的顾虑有三个第一插件成熟度。allure-pytest 是 Allure 官方维护的适配器不是个人开源的小项目版本迭代和 Pytest 版本的兼容性都有保证。第二团队学习成本。团队里如果有人没用过其实只需要记住几个allure.*装饰器其余照常写 Pytest 用例并不需要重写任何测试逻辑。第三CI 集成成本。Allure 命令行工具基于 Java但不需要写 Java 代码只要服务器有 Java 运行环境下载命令行工具丢进 PATH 就能用。Jenkins 上有现成的 Allure 插件GitLab CI 里也能通过artifacts直接归档allure-report目录。综合评估下来替换成本是最低的一条路。而且报告是一次生成、长期复用团队里每个人的本地报告格式都一样沟通成本反而降下来了。2. 环境准备与最小化接入2.1 依赖安装与版本匹配先说环境我用的是 Python 3.9 Pytest 7.4插件版本选的是 allure-pytest 2.13.2Allure 命令行用的 2.24.1。注意一点allure-pytest 跟 Allure 命令行不是一个东西前者是 Pytest 的适配器负责收集数据后者负责把数据渲染成 HTML 报告。安装指令pip install allure-pytest安装完确认插件被 Pytest 正常加载pytest --help | grep allure如果能看到--alluredir和--clean-alluredir这两个参数说明插件已经生效。接着下载 Allure 命令行工具。Windows 用户可以用scoop install alluremacOS 用户可以用brew install allureLinux 用户直接去 Allure 官方 GitHub Releases 页面下载 zip 包解压然后把bin目录写进环境变量。allure --version能正常输出版本号就说明环境已经就绪。2.2 第一次跑出完整报告我先用三个最基础的用例来验证全链路是否通畅import pytest def test_login_success(): assert 1 1 def test_login_failed(): assert 1 2 def test_order_query(): assert ok in ok执行命令pytest --alluredir./allure-results --clean-alluredir--alluredir指定原始数据输出目录--clean-alluredir每次执行前自动清空旧数据避免多轮执行混在一起。执行完allure-results目录下会出现一堆.json和.txt文件这些就是后续渲染报告的原料。然后渲染 HTMLallure generate ./allure-results -o ./allure-report --clean-o指定报告输出目录--clean先清空报告目录再生成。或者你只想本地随便看看直接输入allure serve ./allure-results这条命令会启动一个临时 HTTP 服务自动打开默认浏览器用完即走不落地报告文件。我第一次跑通的时候看到页面上清晰的绿色用例、失败用例的可视化堆栈和进度条就知道这事稳了。3. 让报告真正会用的核心功能实战3.1 Feature 和 Story 的组织思路allure.feature和allure.story是 Allure 报告里最重要的一对组织维度。我的理解是feature对应业务模块的功能点story对应这个功能点下的具体用户场景。类比到电商项目feature是登录模块story就是验证码登录成功、密码错误三次锁定这类更细的场景。实际用法import allure allure.feature(登录模块) class TestLogin: allure.story(验证码登录) def test_login_by_code(self): pass allure.story(密码登录) def test_login_by_password(self): pass这样生成的报告左侧就能按模块逐级展开点击任意 story还能看到这组用例的执行率和最近几次的趋势。这个组织方式在用例超过 200 条之后价值特别明显测试计划汇报时按 feature 汇总通过率比贴一张大表格直观得多。3.2 Step 装饰器把用例过程拆成人话很多测试报告不好懂不是因为数据不全而是因为过程不透明。allure.step就是用来解决这个问题。allure.step(调用登录接口获取 token) def get_token(username, password): return request_login(username, password) allure.step(校验 token 是否有效) def validate_token(token): return token_expire_check(token)嵌套的 step 会在报告里形成树状结构点击每一条能展开对应的参数输入和返回结果。这比把整个请求写进一个长长的断言里清楚太多了。我在实际工作中甚至会把数据库查询也包成一个 step这样开发同学排查失败用例时连数据准备阶段发生过什么都一目了然。需要注意两个细节step 函数内部如果再调用别的 step 函数会自动形成嵌套关系层级不要太深超过四层看起来就很累了step 名称里尽量不要拼长得离谱的参数值我在报告里看到过有人把整个 POST 请求体塞进标题里整页全是转义字符反而干扰阅读。请求体可以用allure.attach挂到附件里。3.3 Attach用例的物证allure.attach是排查问题时的神器。UI 自动化失败时能截一张图直接挂在报告里接口测试失败时能把返回的 JSON 原样贴上。allure.attach(登录响应, body, allure.attachment_type.JSON)常用的附件类型有TEXT、HTML、PNG、JPG、JSON、XML等。我做 Web 自动化时通常会在 fixture 的 teardown 里自动判断用例失败然后立即截图挂到报告import allure import pytest pytest.hookimpl(hookwrapperTrue) def pytest_runtest_makereport(item, call): outcome yield report outcome.get_result() if report.when call and report.failed: driver item.funcargs.get(driver) if driver: allure.attach( driver.get_screenshot_as_png(), name失败截图, attachment_typeallure.attachment_type.PNG )这思路再往前一步接口层日志、服务端返回的错误栈都可以通过 attach 挂进去。失败用例的报告里证据链越完整定位问题的时间就越短。3.4 Severity 与动态标题allure.severity用来标记用例的重要程度报告右上角可以按严重级别筛选。级别从轻到重依次是TRIVIAL、MINOR、NORMAL、CRITICAL、BLOCKER。allure.severity(allure.severity_level.CRITICAL) def test_payment_deduct(): pass另一个实用的装饰器是allure.title它可以覆盖用例函数名在报告里的默认显示。这里有个小技巧标题可以直接传参数动态拼出可读性更高的名称。allure.title(用户 {user} 下单验证) pytest.mark.parametrize(user, [alice, bob]) def test_order(user): pass报告里显示的就不再是test_order[alice]这种难认的技术名而是 用户 alice 下单验证 这样一眼能看懂的业务描述。团队里非技术的同事打开报告也能快速找到自己关心的场景。4. 报告美化与数据定制的进阶玩法4.1 categories给失败原因做归类统计Allure 默认会把所有失败用例堆在一个 Failed 分类里但真实的失败原因是多样的有的是断言数据不对有的是服务端 500有的是环境不稳定超时。如果想要报告更贴近真实情况可以在allure-results目录旁边放一个categories.json执行时 Allure 会自动读取它把失败用例做二次分类。[ { name: 服务端异常, matchedStatuses: [failed], messageRegex: .*500 Internal Server Error.* }, { name: 断言失败, matchedStatuses: [failed], messageRegex: .*AssertionError.* }, { name: 执行超时, matchedStatuses: [broken], messageRegex: .*Timeout.* } ]放到执行目录后重新 generate 报告失败分类就是自定义的了。我在项目里用这个功能把测试环境上游服务不稳定和被测代码真正出问题区分开拿到的统计才具有决策价值。4.2 environment.properties把环境信息写进报告Allure 报告首页有一个 Environment 区域可以展示测试环境的操作系统、浏览器版本、服务地址、数据库版本等信息。实现方式是在allure-results目录下创建一个environment.propertiesBrowserChrome 120.0.6099.109 Browser.Version120.0.6099.109 Test.Hostapi.example.com Databasetest_db_v3这样看报告的人就不会问这是哪套环境跑的排查问题也能快速对齐上下文。如果环境信息是动态变化的可以在 conftest 里写一个 session 级别的 fixture执行前把当前环境信息写进文件保证每次报告的环境数据都是最新的。4.3 参数化数据的报告展示Pytest 的参数化在 Allure 报告里默认展示为用例如表格的多个执行条目每条有自己的执行结果。配合allure.title动态命名后参数取值能直接展示在标题里。此外Allure 还支持allure.testcase和allure.issue链接可以把用例关联到测试管理平台或者缺陷单的 URL 上。allure.testcase(https://jira.example.com/TEST-101, 需求单) allure.issue(https://bug.example.com/BUG-202, 缺陷单) def test_pay(): pass报告里就会出现可点击的外链入口从报告到需求到缺陷的链路就通了。5. 与 CI 集成和团队协作的落地经验5.1 Jenkins 上的配置要点在 Jenkins 上使用 Allure 报告最省力的方式是安装 Allure Plugin然后在构建后操作里选择 Allure Report填入allure-results的路径。Jenkins 会自动完成generate和归档展示趋势图也能保留历史数据。有一个关键坑必须提醒如果项目是在 Docker 容器里跑测试容器里一定得有 allure 命令行工具且 Jenkins 节点上的 Allure 插件配置路径要跟容器里的可执行文件对上。我踩过一次宿主机上有 allure容器里没有报告一直生成失败最后排查发现是构建镜像时漏了这一步加上RUN curl ... unzip就正常了。5.2 GitLab CI 的归档方式GitLab CI 里不依赖插件直接在gitlab-ci.yml里用 artifacts 归档即可report: stage: test script: - pytest --alluredirallure-results --clean-alluredir - allure generate allure-results -o allure-report --clean artifacts: when: always paths: - allure-report/ expose_as: allure-reportwhen: always保证用例失败时报告照样归档不会因为非零退出码丢掉结果。打开 CI 作业页面就能浏览完整报告。用这种方案每次代码提交跑完流水线质量门禁结果和可视化报告就同时出来测试和开发都不用到处翻日志。5.3 多轮执行数据合并有时候我会分模块并行跑测试最后想汇总成一份总报告。Allure 支持把不同轮次的原始数据合并到同一个allure-results目录再执行一次 generate数据会自动汇总。合并数据时注意一个成语同名用例会被去重合并所以并行任务里最好保证用例名全局唯一。否则两个任务各自生成的同名用例会被算作同一条统计口径就乱了。6. 常见问题与排查技巧实录6.1 报告打开后一片空白不少人第一次打开allure-report/index.html直接双击文件结果页面空白。原因是 Allure 报告依赖静态资源路径直接通过file://协议打开时浏览器会限制跨文件访问。解法很简单allure open allure-report或者在项目里起一个任意静态服务比如python -m http.server 8000然后访问http://localhost:8000/allure-report/。所以配置 CI 或者本地查看时别直接双击 HTML 文件这是个最常见的伪失败。6.2 中文乱码如果报告里的中文显示为乱码通常不是 Allure 的问题而是 JSON 数据文件编码没对齐。Pytest 默认输出字符串通常是 UTF-8但如果用例文件顶部没有声明# -*- coding: utf-8 -*-或者项目里有其他编码干扰就可能出问题。更稳妥的做法是在pytest.ini里加一行[pytest] testpaths tests同时确保读取文件时都显式指定encodingutf-8。报告渲染侧 Allure 默认按 UTF-8 解析只要数据侧编码统一中文展示基本不会乱。6.3 allure-results 里数据很多但 report 里用例丢失这种情况我遇到过两次基本都是因为并发执行。用pytest-xdist跑并行时多个 worker 同时写allure-results如果插件版本对 worker 支持不彻底容易出现部分 worker 的数据覆盖或遗漏。更稳的做法xdist 模式下每个 worker 指定独立的 allure-results 目录最后合并。pytest --alluredirallure-results-worker-1 -n2 pytest --alluredirallure-results-worker-2 -n2 allure generate allure-results-worker-1 allure-results-worker-2 -o allure-report新版本 allure-pytest 对 xdist 的支持已经很成熟但如果是老项目这个老办法依然有效。6.4 装饰器加了但没有效果allure.step、allure.feature已经加到函数上了报告里却没有体现优先确认插件是否被 Pytest 加载了。有时候因为项目里存在多个测试框架的插件配置或者虚拟环境切错Pytest 根本没加载 allure-pytest。排查方法pytest --alluredir./allure-results --clean-alluredir tests/如果控制台输出里能看到allure的钩子日志就说明加载成功。另外注意装饰器是加在测试用例上不是加在 conftest 的 fixture 上fixture 里的步骤要用with allure.step(...)或者用 step 装饰器包裹独立函数。6.5 报告生成慢用例不多但报告生成极慢通常是被测试里的阻塞等待拖的不是渲染问题。不过也有特殊情况每次allure generate时如果旧报告目录没有清理文件海量堆积会影响性能。建议固定使用--clean参数既清空原报告目录又能保证每次生成的报告是当前数据的完整快照。6.6 失败重跑与报告覆盖用pytest-rerunfailures做失败重跑时Allure 默认会记录最后一次执行的结果。如果要保留重跑过程的原始数据建议配合allure.step把每次尝试都记录下来这样报告里能看到失败的瞬时信息和最终成功的路径排查稳定性问题时特别有用。一点个人体会在实际项目里真正让 Allure 报告发挥价值的其实不是装好工具而是团队对报告内容形成统一规范什么时候挂截图、什么时候贴报文、feature 和 story 怎么划分、环境信息写在哪。我后来把这份玩法沉淀成了项目里的测试开发约定新人进来照着模板写用例出来的报告质量都很稳定。如果团队里有人给你反馈报告看不懂大概率不是他不熟悉 Allure而是报告里的信息组织本身就不够清晰。这一套从装饰器到分类规则再到 CI 落地就是把这些含糊的问题一件件变成明确的工程约定。
返回列表