专栏文章 Pytest 测试框架系列 - pytest-allure 生成测试报告,更加直观的掌控测试结果!

king158 · 2021年07月19日 · 最后由 king158 回复于 2021年07月21日 · 128 次阅读

原文:allure 生成报告

前言

前面文章写了使用 pytest-html 插件生成报告,那为什么还要讲解使用 allure 来生成报告呢?从 pytest-html 生成的报告看出来还是缺少一些报告的元素,如直观的展示不同的维度统计用例执行结果图表,还有就是领导喜欢直观、简洁、数据清晰的测试报告,相信大家都喜欢这样的报告,所以为了大家的发展,不管怎么样都要学会更好看的报告。

allure 简介

官方说明地址:https://docs.qameta.io/allure/#_about
Allure Framework

  • Allure Framework is a flexible lightweight multi-language test report tool that not only shows a very concise representation of what have been tested in a neat web report form, but allows everyone participating in the development process to extract maximum of useful information from everyday execution of tests.
  • From the dev/qa perspective Allure reports shorten common defect lifecycle: test failures can be divided on bugs and broken tests, also logs, steps, fixtures, attachments, timings, history and integrations with TMS and bug-tracking systems can be configured, so the responsible developers and testers will have all information at hand.
  • From the managers perspective Allure provides a clear 'big picture' of what features have been covered, where defects are clustered, how the timeline of execution looks like and many other convenient things. Modularity and extensibility of Allure guarantees that you will always be able to fine-tune something to make Allure suit you better.

翻译:

  • Allure Framework 是一种灵活的轻量级多语言测试报告工具,不仅可以以简洁的 Web 报告形式非常简洁地显示已测试的内容,也允许参与开发过程的每个人从日常测试中提取最大程度的有用信息。
  • 从开发/质量保证的角度来看,Allure 报告可以缩短常见缺陷的生命周期:可以将测试失败划分为 bug 和损坏的测试,还可以配置 log,step,fixture,attachments,timings,历史记录以及与 TMS 的集成以及 Bug 跟踪系统,因此负责任的开发人员和测试人员将掌握所有信息
  • 从管理人员的角度来看,Allure 提供了一个清晰的 “全局”,涵盖了已涵盖的功能,缺陷聚集的位置,执行时间表的外观以及许多其他方便的事情,Allure 的模块化和可扩展性确保您始终能够微调某些东西,以使 Allure 更适合您

allure 环境搭建

  • python 环境 (前面已安装) 版本: 3.7.0
  • pytest(前面已安装) 版本: 6.2.4
  • allure 命令行工具配置 版本:2.14.0
  • allure-pytest 安装 版本: 2.9.43

allure 命令行工具配置

  • allure 是一个命令行工具,需要去 github 上下载最新版 GitHub 下载地址,最近感觉 GitHub 有时访问不了,我已经下载了离线包给大家下载使用,离线下载地址 提取码:6666
  • 环境配置:将下载的 allure-2.14.0.zip 解压到一个盘的根目录,如 E:\allure-2.14.0
  • 因为是需要在任何地方可以执行 allure 命令,需要配置到环境变量 添加allure到环境变量
  • 检查是否配置成功,在 cmd 命令窗口输入: allure --version,显示出 2.14.0 就代表配置成功 查看是否检查成功

allure-pytest 安装

  • 直接在相应环境的 cmd 命令窗口输入:pip install allure-pytest 安装最新版即可。
  • 检查安装版本,输入: pip show allure-pytest 版本信息

allure 报告尝鲜

是不是到现在为止,大家都想看下 allure 长得怎么样,那我们就先写个简单的 demo,生成一个简单的报告给大家看下,在进行详细的讲解。

test_allure.py 代码:

# !/usr/bin/python3
# _*_coding:utf-8 _*_
""""
# @Time  :2021/7/13 22:53
# @Author  : king
# @File    :test_allure.py
# @Software  :PyCharm
# @blog     :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import pytest
import logging

def test_01():
    """我是 test_01 用例描述"""
    logging.info("用例 test_01 执行完成。。")
    assert True

def test_02():
    """我是 test_02 用例描述"""
    logging.info("用例 test_02 执行完成。。")
    assert False

def test_03():
    """我是 test_03 用例描述"""
    logging.info("用例 test_03 执行完成。。")
    assert True

if __name__ == '__main__':
    pytest.main()
  • 在命令行先输入: pytest --alluredir ./allure_report test_allure.py ,是不是看见当前路径生成一个allure_report目录,那里面就是 allure 生成报告需要的测试记录数据 allure报告数据
  • 再输入:allure serve allure_report,就会自动在默认浏览器打开 allure 报告,默认为英文模式 allure报告
  • 通过左下角的按钮,切换到中文 切换到中文模式
  • 查看页面中文报告样式 中文报告样式 再看下测试套界面 图表界面信息

就从这这些界面,可以看出来,这个报告是不是数据、图表很丰富,还有看见好多地方显示空白、数据不是很丰富,大家不要着急,接下来会讲解如何将我们的报告更加丰富起来。

allure 报告丰富详解

首先,我们该怎么丰富呢,从哪些方面出发?这里我就当大家写过功能测试用例,功能测试用例要素应该包括功能、模块、编号、标题、前提条件、操作步骤、用例等级、预期结果、实际结果、测试数据等等,我们的自动化用例应该是从功能用例转化而来,下面让我看下 allure 报告里面有哪些常用方法,见下表。

方法 参数说明
@allure.epic() 可以认为是大功能模块,敏捷里面的概念,史诗
@allure.feature() 模块名称,功能点的描述
@allure.story() 用户故事
@allure.title() 用例的标题
@allure.testcase() 测试用例的链接地址
@allure.issue() 缺陷链接
@allure.description() 用例描述
@allure.step() 用例步骤
@allure.severity() 用例等级
@allure.link() 链接
@allure.attach() 附件

使用方法说明:我们看见表格里面的方法就应该知道,都是以装饰器的方式进行使用,下面看下详情使用情况

用例描述方法详解

epic——测试用例特性(主要业务模块)

feature——测试用例特性(主要功能模块)

story——feature 功能模块下的分支功能 (用户故事)

severity——测试用例的等级

class Severity(str, Enum):
    BLOCKER = 'blocker'  # blocker:阻塞缺陷(功能未实现,无法下一步)
    CRITICAL = 'critical' # 严重缺陷(功能点缺失)
    NORMAL = 'normal' # 一般缺陷(边界情况,格式错误)
    MINOR = 'minor' # 次要缺陷(界面错误、ui问题)
    TRIVIAL = 'trivial' # 轻微缺陷(非重点功能的轻微问题)

step——测试用例的步骤

  • 使用方法:
    • @allure.step() 只能以装饰器的形式放在类或者方法上面  
    • with allure.step(): 可以放在测试用例方法里面,但是需要将测试步骤的代码放在 with 作用域内 示例

报告示例

attach——主要用户测试报告中添加附加信息,通常是一些测试数据、附件

  • 使用方法:allure.attach(body, name, attachment_type, extension)
    • body - 要写入文件的原始内容
    • name - 包含文件名的字符串
    • attachment_type - 其中一个 allure.attachment_type 值
    • extension - 提供的将用作创建文件的扩展名 用例示例

附件

title——更改测试报告中测试用例的标题

description——用例描述

  • 使用方法:注意,如果不设置,自动读取方法里面的注释,如果设置则为设置的信息

link/issue/testcase——链接

Allure 报告完整示例

由于用例需要前置条件,我们就使用 fixture 来实现,我们将 fixture 写到 conftest.py 文件里面:

conftest.py 代码:

# -*- coding: utf-8 -*-

"""
# @Project  :demo_test
# @Time    :2021/7/14 14:47
# @Author  :king
# @File    :conftest.py
# @blog     :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import pytest
import logging

def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上
    :return:
    """
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode_escape")
        item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")

@pytest.fixture(scope="session", autouse=True)
def login():
    logging.info("我是登录功能")
    yield
    logging.info("我是退出功能")

case_step.py 代码:

# -*- coding: utf-8 -*-

"""
# @Project  :pytest_demo
# @Time    :2021/7/14 14:46
# @Author  :king
# @File    :case_step.py
# @blog     :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import allure
import logging

@allure.step("我是操作步骤一")
def step_01():
    logging.info("我是操作步骤一......")

@allure.step("我是操作步骤二")
def step_02():
    logging.info("我是操作步骤二......")

@allure.step("我是操作步骤三")
def step_03():
    logging.info("我是操作步骤三......")

@allure.step("我是操作步骤四")
def step_04():
    logging.info("我是操作步骤四......")

@allure.step("我是添加附件")
def step_05():
    logging.info("我是添加附件......")
    allure.attach(open("test.PNG", mode="rb").read(), "截图", allure.attachment_type.PNG)

test_allure.py 代码:

# !/usr/bin/python3
# _*_coding:utf-8 _*_
""""
# @Time  :2021/7/14 14:46
# @Author  : king
# @File    :test_allure.py
# @Software  :PyCharm
# @blog     :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import logging
import allure
import pytest

from class_06.case_step import step_02, step_01, step_03, step_04, step_05


@allure.epic("备课")
@allure.feature("教材管理")
class TestTextBook:

    @allure.story("添加教材成功")
    @allure.testcase("http://XXX.XXX.x.x:8081/butly/testcase-1.html")
    @allure.issue("http://XXX.XXX.x.x:8081/butly/bug-1.html")
    @allure.link("https://blog.csdn.net/u010454117")
    @allure.title("添加教材")
    @user61tml("<h2><font color='red'>正常添加教材</font></h2>")
    @allure.severity(allure.severity_level.CRITICAL)
    def test_add_textbook(self):
        """用例描述:
        1.在教材界面,点击新增按钮
        2.在新增教材界面,选择教材版本、章节信息
        3.点击确定按钮
        """
        logging.info("开始添加教材操作")
        step_01()
        step_02()
        step_05()
        logging.info("添加教材完成")

    @allure.testcase("http://XXX.XXX.x.x:8081/butly/testcase-2.html")
    @allure.issue("http://XXX.XXX.x.x:8081/butly/bug-3.html")
    @allure.link("https://blog.csdn.net/u010454117")
    @allure.title("删除教材")
    @allure.story("删除教材成功")
    @allure.description("正常删除教材数据")
    @allure.severity(allure.severity_level.CRITICAL)
    def test_delete_textbook(self):
        """用例描述:
        1.在教材界面,选择需要删除的教材
        2.在教材界面,点击删除按钮
        3.再确认删除界面,点击确定按钮
        """
        logging.info("开始删除教材操作")
        step_03()
        step_04()
        logging.info("删除教材完成")

@allure.epic("备课")
@allure.feature("资源管理")
class TestResources:

    @allure.testcase("http://XXX.XXX.x.x:8081/butly/testcase-5.html")
    @allure.issue("http://XXX.XXX.x.x:8081/butly/bug-5.html")
    @allure.link("https://blog.csdn.net/u010454117")
    @allure.title("添加资源")
    @allure.story("添加资源成功")
    @allure.severity(allure.severity_level.CRITICAL)
    def test_add_resources(self):
        """用例描述:
        1.在资源界面,点击添加的资源
        2.在资源预览界面,点击添加按钮
        """
        logging.info("开始添加资源操作")
        step_01()
        step_02()
        step_05()
        logging.info("添加资源完成")

    @allure.testcase("http://XXX.XXX.x.x:8081/butly/testcase-6.html")
    @allure.issue("http://XXX.XXX.x.x:8081/butly/bug-6.html")
    @allure.link("https://blog.csdn.net/u010454117")
    @allure.title("删除资源")
    @allure.story("删除资源成功")
    @allure.severity(allure.severity_level.CRITICAL)
    def test_delete_resources(self):
        """用例描述:
        1.在备课界面,点击资源的删除按钮
        2.在资源删除确定界面,点击确定按钮
        """
        logging.info("开始删除资源操作")
        step_01()
        step_04()
        logging.info("删除资源完成")
        assert "删除成功" == "删除教材成功"

if __name__ == '__main__':
    pytest.main()

目录结构如下:
运行文件目录结构

在线报告

  • 1.在命令行再次输入: pytest --alluredir ./allure_report test_allure.py ,是不是看见当前路径生成一个allure_report目录,那里面就是 allure 生成报告需要的测试记录数据
  • 2.再次命令输入:allure serve allure_report 命令,自动打开 allure 报告,切换到中文
  • 3.查看报告界面

离线报告

  • 1.第一步跟在线报告一样
  • 2.运行命令 allure generate allure_report -o ./html --clean, 可以看出来生成一个html的目录。使用浏览器打开里面的 index.html 文件,也可以打开报告
    离线报告

  • 总览界面
    总览界面数据

  • 类别页面,显示失败的用例详情
    列表界面

  • 测试套
    测试套详情

  • 图表界面
    图表界面

  • 时间刻度
    时间刻度

  • 功能界面
    功能界面


  • 在这里插入图片描述

从上面执行结可以看出来,allure 添加了不同的属性之后,测试报告上面用例操作可以跟功能测试用例一样,非常容易知道自动化用例具体执行了什么操作,这样的报告给大家非常清晰、明了。

总结

  • 本文首先讲解了 allure 报告的优点及环境安装
  • 详细讲解了 allure 报告与测试用例属性使用
  • allure 生成报告两种方式

以上为内容纯属个人理解,如有不足,欢迎各位大神指正,转载请注明出处!

如果觉得文章不错,欢迎关注微信公众号,微信公众号每天推送相关测试技术文章
搜索【测试之路笔记】

共收到 9 条回复 时间 点赞

我擦,写的这么好的帖子竟然没人回复,正好在找类似的资料,楼主写的真心不错!
点个赞😀

king 队长刚来啊

难删亦删 回复

这个系列的还没完全复制过来
原文

以前没写到这里面,最近感觉还是需要梳理一遍自己懂的,慢慢已系列来写

你应该是在 testin 和我做过任务 对么😀

悄悄跟着楼主学一波,然后惊呆所有人

king158 回复

是滴呀老哥,关注你了哦

写的很好,但是我都会了😂

watchdog 回复

这些都是有需要的可以看,会的等于回顾一下

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册