Pytest测试框架系列 - 自从使用 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 命令,需要配置到环境变量
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
  • 检查是否配置成功,在cmd命令窗口输入: allure --version,显示出 2.14.0 就代表配置成功
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

allure-pytest 安装

  • 直接在相应环境的cmd命令窗口输入:pip install allure-pytest 安装最新版即可。
  • 检查安装版本,输入: pip show allure-pytest
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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 生成报告需要的测试记录数据
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
  • 再输入:allure serve allure_report,就会自动在默认浏览器打开allure报告,默认为英文模式
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
  • 通过左下角的按钮,切换到中文
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
  • 查看页面中文报告样式
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 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——测试用例特性(主要业务模块)

  • 使用方法:@allure.epic()
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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

  • 使用方法:@allure.feature()
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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

  • 使用方法:@allure.story()
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

severity——测试用例的等级

  • 使用方法:@allure.severity(allure.severity_level.CRITICAL ) 或者 @allure.severity(‘critical’)
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 常用等级划分

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

step——测试用例的步骤

  • 使用方法:
    • @allure.step() 只能以装饰器的形式放在类或者方法上面
    • with allure.step(): 可以放在测试用例方法里面,但是需要将测试步骤的代码放在with作用域内
      Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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

  • 使用方法:allure.attach(body, name, attachment_type, extension)
    • body - 要写入文件的原始内容
    • name - 包含文件名的字符串
    • attachment_type - 其中一个allure.attachment_type值
    • extension - 提供的将用作创建文件的扩展名
      Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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

  • 使用方法:@allure.title()
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

description——用例描述

  • 使用方法:注意,如果不设置,自动读取方法里面的注释,如果设置则为设置的信息
    • @allure.description() 提供描述字符串的装饰器
    • @allure.description_html() 提供一些HTML在测试用例的描述部分
      Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
      Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

link/issue/testcase——链接

  • 使用方法
    • @allure.link()
    • @allure.issue()
    • @allure.testcase()
      Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!
      Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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("添加教材")
    @allure.description_html("<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()

目录结构如下:
Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

在线报告

  • 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 文件,也可以打开报告
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 总览界面
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 类别页面,显示失败的用例详情
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 测试套
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 图表界面
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 时间刻度
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

  • 功能界面
    Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!


  • Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

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

总结

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

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

如果觉得文章不错,欢迎关注微信公众号,微信公众号每天推送相关测试技术文章
Pytest测试框架系列 - 自从使用 allure 生成测试报告,我的领导对我更加满意了!

上一篇:微软开战谷歌?传闻中正在开发的Windows Lite轻系统将正面迎击Chrome OS


下一篇:2021python+pytest+allure测试框架的搭建(1)