原文:allure 生成报告

前言

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

allure 简介

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

翻译:

allure 环境搭建

allure 命令行工具配置

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()

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

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——测试用例的步骤

报告示例

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

附件

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()

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

在线报告

离线报告

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

总结

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

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


↙↙↙阅读原文可查看相关链接,并与作者交流