文章目录

  • 下载安装
  • 报告内容
  • Overview 报告概述
  • Categories 类别
  • 如何创建自定义缺陷分类
  • Suites 测试套件
  • Graphs 图表
  • Timeline 时间线
  • Behaviors 行为
  • Packages 包
  • 生成报告的命令
  • 设置报告中的测试环境
  • 设置历史趋势文件
  • 开启端口访问,分享测试报告
  • 自动获取测试失败截图
  • 常用用法
  • 设置标签


下载安装

  • 第三方库,需要安装:pip install allure-pytest 或者 easy_install allure-pytest
  • 下载allure 命令工具 : Releases · allure-framework/allure2 · GitHub
  • 配置环境变量path: —目的调用allure
    path环境变量中新增 allure安装目录/bin

cmd命令path

验证:

pytest 并发 selenium python pytest allure_allure


报告内容

Overview 报告概述

pytest 并发 selenium python pytest allure_python_02

“概述”页包含多个默认小部件,这些小部件表示项目和测试环境的基本特征。

  • 统计 - 整体报告统计。
  • 启动 - 如果此报告表示多次测试启动,则此处将显示每次启动的统计信息。
  • 行为 - 根据故事和特征聚合的结果信息。
  • 执行程序 - 有关用于运行测试的测试执行程序的信息。
  • 历史趋势 - 如果测试积累了一些历史数据,它将计算其趋势并显示在图表上。
  • 环境 - 有关测试环境的信息(请参阅如何定义环境)。

主页小部件是可拖动和可配置的。此外,Allure支持它自己的插件系统,因此可以进行完全不同的小部件布局。

导航栏是可折叠的,可用于切换到多个基本结果概述模式。

Categories 类别

“类别”选项卡还可以创建自定义缺陷分类以应用测试结果的方法。

pytest 并发 selenium python pytest allure_json_03

如何创建自定义缺陷分类

默认情况下,有两类缺陷:

  • 产品缺陷(测试失败)
  • 测试缺陷(破损的测试)

要创建自定义缺陷分类,请在生成报告之前将categories.json文件添加到目录allure-results/categories.json中。

  • categories.json 文件内容:
[
  {
    "name": "Ignored tests", 
    "matchedStatuses": ["skipped"] 
  },
  {
    "name": "Infrastructure problems",
    "matchedStatuses": ["broken", "failed"],
    "messageRegex": ".*bye-bye.*" 
  },
  {
    "name": "Outdated tests",
    "matchedStatuses": ["broken"],
    "traceRegex": ".*FileNotFoundException.*" 
  },
  {
    "name": "Product defects",
    "matchedStatuses": ["failed"]
  },
  {
    "name": "Test defects",
    "matchedStatuses": ["broken"]
  }
]

参数

描述

name

(必填)类别名称

matchedStatuses

(可选)合适的测试状态列表。违约["failed", "broken", "passed", "skipped", "unknown"]

messageRegex

(可选)正则表达式模式,用于检查测试错误消息。违约".*"

traceRegex

(可选)用于检查堆栈跟踪的正则表达式模式。违约".*"

如果测试结果的状态在列表中,并且错误消息和堆栈跟踪都与模式匹配,则测试结果属于该类别。

categories.json文件可以存储在测试资源目录中,以防使用 allure-mavenallure-gradle 插件。

Suites 测试套件

在“套件”选项卡上,可以找到已执行测试的标准结构表示形式,按套件和类分组。简单来说就是显示原始的结构,不展示allure 标签

pytest 并发 selenium python pytest allure_pytest_04

pytest 并发 selenium python pytest allure_pytest_05

Graphs 图表

pytest 并发 selenium python pytest allure_allure_06

Timeline 时间线

时间轴选项卡可视化测试执行的回顾,allure适配器收集测试的精确计时,在此选项卡上,它们根据其顺序或并行时序结构进行相应安排。

pytest 并发 selenium python pytest allure_pytest_07

Behaviors 行为

对于行为驱动方法,此选项卡根据 Epic、Feature 和 Story 标签对测试结果进行分组。

pytest 并发 selenium python pytest allure_json_08

Packages 包

“包”选项卡表示测试结果的树状布局,按不同的包分组。

pytest 并发 selenium python pytest allure_pytest 并发 selenium_09


生成报告的命令

  • 方式一 : 在脚本运行目录运行
    1 、执行用例生成测试数据 pytest.main(['-s','[测试文件.py]','--alluredir','./allure-result']) 2、生成测试报告 os.system('allure generate ./allure-result -0 ./reports')
  • 方式二: 在命令行或者pycharm终端中运行
    1、生成json文件
    pytest 脚本名称 --alluredir ./report或者
    pytest --alluredir=指定路径(指定allure报告数据生成路径)2、将json文件转换为HTML页面
    allure serve report或者
    allure generate [json文件地址] -o [报告地址] --clean
  • 三: 我自己在用的一种方式 :
    这是我的一个构架图,main 是脚本入口,common 是公共包,我在common 中写了一个方法运用OS模块去启动,

为什么要这样去做呢?

因为我发现在main 入口中运行方式一的命令 ,调用的是pytest 测试框架,而非是allure-pytest 测试框架,所以只是启动了脚本,并没有执行生成报告的程序,通过命令行去运行又太麻烦,我设置了环境文件,设置了历史文件的配置,在每一次生成脚本的时候都需要去调用,插入到测试数据文件中,需要4行以上的代码才能执行完毕,所以创建了这个方法,相当于一键启动。

备注 :tmp 为 测试数据生成目录, report 为测试报告生成目录

1、2、3、4步需要每次都运行,步骤5可以看情况,如果想要别人可以访问你的 allure 报告则可以开启
脚本内容:

def get_report(self):
    # 1 、 生成json文件
    print("正在生成JSON文件".center(76, '-'))
    cmd = r"pytest C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\main\testmain.py " \
          r"--alluredir=C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\tmp  --clean-alluredir "
    os.system(cmd)

    print("正在复制配置信息文件".center(76, '-'))
    # 2、 复制配置文件到json文件中
    cmd1 = r'copy C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\alluer-environment\environment.properties' \
           r' C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\tmp\environment.properties '
    os.system(cmd1)

    print("正在生成报告".center(76, '-'))
    # 3、生成报告
    cmd2 = r"allure generate C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\tmp -o " \
           r"C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\report --clean "
    os.system(cmd2)
    print("报告生成完毕!!!!".center(76, '-'))

    # 4、 替换历史记录文件
    print("正在生成历史趋势文件".center(76, '-'))
    Get_History().get_history()

    # 5、为报告开启端口,共享查看
    # print('正在开启端口,分享报告')
    # cmd3 = r'allure open -h 192.168.81.102 -p 8885 C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\reports'
    # os.system(cmd3)

设置报告中的测试环境

要将信息添加到环境小组件,只需在生成报告之前创建(或)文件到 allure-results 目录即可。

1、创建一个单独测试环境文件 environment.properties,不要放在 allure 报告中,因为报告可能每次运行的时候带了 clean 参数则会删除掉,一般单独放置在一个位置,例如:

pytest 并发 selenium python pytest allure_allure_10

文件内容可以随便写 键和值用等号连起来就可以

实例:

SystemVersion = Windows 11
javaVersion = 1.8.0_131
pythonVersion=3.9.10
pytestversion=6.2.5
allureVersion=2.17.2
pyVersion =1.11.0
pluggyVersion=1.0.0
pycharmVersion = PyCharm 2021.2.1 (Professional Edition)
Browser = Microsoft Edge
rootdir=C:/Users/admin/PycharmProjects/pythonProject/okmarts_test_front
plugins = allure-pytest-2.9.45

2、 在生成报告前将文件复制到 json文件生成目录下 一般情况是 allure-results 我这里用的是 tmp文件夹

# 输出报告
def get_report(self):
    # 1 、 生成json文件
    print("正在生成JSON文件".center(76, '-'))
    cmd = r"pytest C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\main\testmain.py " \
          r"--alluredir=C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\tmp  --clean-alluredir "
    os.system(cmd)

    print("正在复制配置信息文件".center(76, '-'))
    # 2、 复制配置文件到json文件中
    cmd1 = r'copy C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\alluer-environment\environment.properties' \
           r' C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\tmp\environment.properties '
    os.system(cmd1)

    print("正在生成报告".center(76, '-'))
    # 3、生成报告
    cmd2 = r"allure generate C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\tmp -o " \
           r"C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\report --clean "
    os.system(cmd2)
    print("报告生成完毕!!!!".center(76, '-'))

3、运行 allure generate 测试数据生成目录(json文件) 生成报告目录 结果如下

pytest 并发 selenium python pytest allure_pytest 并发 selenium_11


设置历史趋势文件

在 JENKINS 中运行 allure 可能会自动的生成趋势文件,但是如果在本地跑可能历史趋势文件不会自动生成,下面教大家一种手动生成历史趋势文件或者也叫保存历史测试数据的方法:

1、创建一个存放历史趋势文件的目录

pytest 并发 selenium python pytest allure_pytest 并发 selenium_12

2、创建一个保存历史趋势文件的py文件,文件内容:

注意:这个脚本需要运行完成脚本,生成测试报告后才运行

# -*- coding: UTF-8 -*-
"""
保存每次的测试历史记录
用于生成趋势图

设计思路: 首先进行判断当前文件夹内是否存在历史测试记录文件
如果存在--- 说明不是第一次进行测试,那么要做的操作为  1、 读取历史测试数据 使用一个变量进行保存,
                                            2、读取最新的测试报告数据,使用另一个变量保存,
                                            3、使用for循环 获取每次数据,将每次获取的数据加入到旧的历史记录中,
                                             4、将加入新数据后的旧数据覆盖写入到历史文件中,
                                             5、复制文件到报告文件中

如果不存在 --- 说明为第一次执行测试, 具体操作步骤为: 复制测试报告文件到历史文件中 作为首次记录
"""



import os
import json


class Get_History:
    def get_history(self):
        # 先判断是否为第一次生成(如果该目录下没有history-trend.json文件则为第一次)
        if os.path.exists(
                r"C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\save_report_history\history-trend.json"):
            print('文件存在')
            #如果存在文件,则读取现有文件,将新生成的文件加入到现有文件中,再将处理后的文件复制到报告目录下
            #打开json文件获取数据
            f = open(r"C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\save_report_history\history-trend.json")
            old_history_list = json.load(f)
            # print(f'旧的json文件为{old_history_list}')

            #获取新生成的history文件数据
            f1 = open(r"C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\report\history\history-trend.json")
            new_history_list = json.load(f1)
            # print(f'新的json文件为{new_history_list}')

            #遍历新的history文件,文件处理,依次加入到旧的文件中
            for i in new_history_list:
                # print(i)
                old_history_list.append(i)
            # 覆盖写入数据至保存历史数据文件中
            with open(r"C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\save_report_history\history-trend.json","w") as f:
                    json.dump(old_history_list, f)


            s = open(r'C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\save_report_history\history-trend.json')
            total_history_data = json.load(s)[::-1]     #获取倒序的历史总文件
            filename = r'C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\save_report_history\history-trend_desc.json'        #指定文件名创建倒序文件
            with open(filename,'w') as f :
                json.dump(total_history_data,f)


            #将写入后的倒叙文件复制到报告文件中
            cmd = rf'copy {filename} C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\report\widgets\history-trend.json'
            os.system(cmd)

        else:
            print("第一次执行测试?")
            if os.path.exists(r'C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\report\widgets\history-trend.json'):
                print('获取最新数据为第一版,从报告目录复制文件到历史文件保存目录')
                cmd = r'copy C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\report\widgets\history-trend.json C:\Users\admin\PycharmProjects\pythonProject\Okmarts_test_front\save_report_history\history-trend.json'
                os.system(cmd)
            else :
                print('未找到相关测试记录文件,请先执行测试')


if __name__ == '__main__':
    a = Get_History()
    a.get_history()

开启端口访问,分享测试报告

allure open -h [ip地址] -p [端口号] [报告地址]

自动获取测试失败截图

创建conftest.py文件,写入以下内容

pytest 并发 selenium python pytest allure_allure_13

文件内容:

import allure
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

_driver = None

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.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    获取每个用例状态的钩子函数
    :param item:
    :param call:
    :return:
    """
    # 获取钩子方法的调用结果
    outcome = yield
    rep = outcome.get_result()
    # 仅仅获取用例call 执行结果是失败的情况, 不包含 setup/teardown
    if rep.when == "call" and rep.failed:
        # 添加allure报告截图
        if hasattr(_driver, "get_screenshot_as_png"):
            with allure.step('添加失败截图...'):
                allure.attach(_driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)


@pytest.fixture(scope='session')
def driver():
    global _driver
    if _driver is None:
        _driver = webdriver.Chrome()
        _driver.maximize_window()
    yield _driver

实现效果:

pytest 并发 selenium python pytest allure_python_14


常用用法

pytest 并发 selenium python pytest allure_python_15

设置标签

设置报告的一些标签:测试对象名称、测试模块名称、用户故事名称、用例步骤名称、设置测试用例对应的缺陷严重程度

  • @allure.epic(‘测试对象,测试集名称’)
    一般用于测试的大类别下面,有点类似与一篇文章的大标题

报告中展现的位置 :

pytest 并发 selenium python pytest allure_python_16

  • @allure.feature(‘测试模块’)
    相当于二级分类

报告中展现的位置 :

pytest 并发 selenium python pytest allure_pytest_17

  • @allure.story(‘用户故事-用例’)
    三级分类,也是最后一级,allure 里面只存在三级分类

    展现位置:

pytest 并发 selenium python pytest allure_pytest_18

  • @allure.step(‘用例步骤’)
  • @allure.severity(‘严重级别’)
  • @allure.description(‘描述’)
  • @allure.attach(‘添加附件-图片,数据表等,给地址’)
  • with allure.step(‘测试步骤’):

pytest 并发 selenium python pytest allure_pytest_19