pytest系列——allure(原理)之allure工具与pytest测试框架集成

官方介绍

1、Allure Framework是一种灵活的轻量级多语言测试报告工具,不仅可以以简洁的Web报告形式非常简洁地显示已测试的内容,也允许参与开发过程的每个人从日常测试中提取最大程度的有用信息。

2、从开发/质量保证的角度来看,Allure报告可以缩短常见缺陷的生命周期:可以将测试失败划分为bug和损坏的测试,还可以配置log,step,fixture,attachments,timings,历史记录以及与TMS的集成以及Bug跟踪系统,因此负责任的开发人员和测试人员将掌握所有信息。

3、从管理人员的角度来看,Allure提供了一个清晰的“全局”,涵盖了已涵盖的功能,缺陷聚集的位置,执行时间表的外观以及许多其他方便的事情。

4、Allure的模块化和可扩展性确保您始终能够微调某些东西,以使Allure更适合您。

5、在当前市面上所有第三方或者自研的测试报告系统中,Allure 是最全面,且支持的测试框架最多的一个测试报告系统。它是开源的测试报告框架,它旨在创建让团队每一个人都清楚明了的测试报告。

Allure 报告之所以受到开发、测试,甚至管理人员的推崇,是因为它有如下明显的特点:

1、从开发/质量保证的角度看,Allure 报告可以缩短常见缺陷的生命周期。

2、可以将测试失败划分为 bug 和损坏的(Broken)测试,还可以配置日志、步骤、固定装置、附件、时间、历史记录,以及与 TMS 的集成和 Bug 跟踪系统,方便将 Task 与负责 Task 开发人员和测试人员绑定,从而使开发和测试人员第一时间掌握所有信息。

3、从管理者的角度看,Allure 提供了一个清晰的“全局”视野。包括本次测试涵盖了哪些功能,Bug 在哪个 case 用例中被发现,以及整体测试用例、单条测试用例的执行时间等信息。

Allure 报告生成的原理

Allure 报告是基于标准的 xUnit 结果输出,再添加补充数据而生成的,其报告的生成基于如下两个步骤。

1、在测试执行期间,一个名为 Adapter 的小型 library 被连接到测试框架中,并将所有测试执行的信息保存到 XML 文件中。对于大多数编程语言下的流行测试框架(例如 python 语言中的 pytest,Java 中的 jUnit 等),Allure 都默认为其提供了 Adapter。

2、获取 XML 文件后,Allure 会将这些 XML 文件转换为 HTML 报告。这一步骤可以通过持续集成系统的 Allure 插件,或者命令行命令实现。

前言【环境配置】

python中有关allure测试报告的第三方包安装:

pip install allure-pytest

该命令将安装 allure-pytest 包与 allure-python-commons 两个第三方包。

用以生成与Allure报告兼容的报告数据。例如测试用例执行后的结果存放于指定的文件夹中的json文件与xml文件。

早些时候也会选择安装 pytest-allure-adaptor 插件去实现生成allure测试报告;但是现在由于pytest-allure-adaptor版本过低不兼容当前版本的allure,所以选择不安装此插件,而是选择安装 allure-pytest 来实现生成allure测试报告。

window操作系统:https://www.cnblogs.com/guanqibuyu/p/16621208.html

mac操作系统:https://www.cnblogs.com/guanqibuyu/p/16621221.html

命令

1、pytest执行测试用例并将执行后的每个测试用例的结果存放于指定的文件夹中,生成一个个的json或者xml文件(allure测试报告原始数据)。

【其中,生成的报告都以json格式存储,日志以txt后缀名文件存储,附件是以attach后缀名文件存储】

pytest --alluredir=./report/tmp    # --alluredir表示指定测试报告数据的生成路径

执行完成上述命令后,会在当前目录下,report目录下生成一个tmp目录文件;

image

2、allure将测试报告的原始数据生成测试报告。【注意:这里只是将tmp目录中的测试报告原始数据在指定的文件夹生成allure测试报告,并未在本机开启一个allure服务】

allure generate report/tmp -o report/allure-report -c report/allure-report  # 此种方式可能会在生成报告的的时候报:report/allure-report does not exist

# 或者

allure generate report\tmp -c -o report\allure-report  # 最好使用该命令生成测试报告(与Jenkins上allure插件生成测试报告一致)
  • report/tmp:每个用例的执行结果生成的每个json文件存放的位置【allure最终会将这些json文件渲染成网页结果】
  • -o report/allure-report:allure报告生成的位置【指定目录生成测试报告】
  • -c report/allure-report:新的allure报告生成之前先把先前的allure报告清理掉

image

3、打开生成的报告,查看。【allure命令2、3结合起来运行】

allure open report/allure-report
  • 参数:-h, (--host):指定域名地址;
  • 参数:-p, (--port):指定端口号;

image

【注意】:【或者:忽略2、3步骤,直接在1结束之后,再运行4步骤】

4、打开生成的报告,可对外提供在线展示。【在本机开启一个allure服务,其他主机可通过IP地址和端口号远程查看allure报告】

allure serve report/tmp
  • 参数:-h, (--host):指定域名地址;
  • 参数:-p, (--port):指定端口号;

image

allure标记描述

image

image

allure报告详解

image

image

1、查看suites(函数级别的测试用例)

包名 --- 模块名 --- 测试用例

image

2、查看suites(类级别的测试用例)

包名 --- 模块名 --- 类名 --- 测试用例

image

3、查看测试用例详情

image

①parameters:如果用了 @pytest.mark.parametrize ,在右侧的parameters是可以看到传了什么参数以及对应的值。

②set up:调用fixture的前置操作。

③tear down:调用fixture的后置操作。

4、Allure报告结构

1、Overview:项目总览

项目总览显示了总体测试运行的一系列统计信息。例如:

1、本次测试执行了多长时间?

2、总共执行了多少测试用例?

3、有多少测试用例执行成功?

4、有多少测试用例执行失败?

5、有多少测试用例是非正常失败的?(不是由于断言失败,而是由于环境不稳定,运行中突发错误而导致的失败。)

6、每条测试用例执行了多长时间?

7、本次测试在哪个环境运行?是开发环境、集成测试环境还是生产环境?

8、本次测试运行在哪个操作系统上?

image

2、Categories:按缺陷种类分析;如下图:

image

直译:分类

理解:测试用例结果的分类

默认情况下,有两类缺陷:
1、Product defects 产品缺陷(测试结果:failed):表示真正的测试执行失败,如果 Categories 里出现这个错误,通常表明测试用例最后的输出跟期望不符合,有 Bug 出现。
2、Test defects 测试缺陷(测试结果:error/broken):表示测试用例本身有问题导致的错误,如果 Categories 里出现这个错误,通常表明测试用例在执行过程中出错了,需要我们进一步调查原因。
默认将测试用例的执行结果分了 Failed、Broken、Passed、Skipped、Unknown  ;凡是测试用例的执行结果是其中一个的都会被归到类里面,可以通过这里点击筛选从而快捷查看所有相同执行结果的测试用例。
除此之外,我们是可以创建自定义缺陷分类的,将 categories.json 文件添加到allure-results目录即可(和 environment.properties文件放同一个目录)
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"]
  }
]


categories.json文件中参数的含义:
name:必填项,分类的名字
matchedStatuses:可选项,测试用例的运行状态,默认是["failed", "broken", "passed", "skipped", "unknown"]
messageRegex:可选项,测试用例运行的错误信息,使用正则表达式匹配。默认是".*"
traceRegex:可选项,测试用例运行的堆栈信息,使用正则表达式匹配。默认是".*"

下图是修改后的测试用例执行结果的分类:(添加了一个忽略测试 Ignored test 类别)

image

3、Suites:按测试套件分析(Suites):测试套件分析显示了按照套件和类划分的所有的测试执行情况。【测试套件,所有用例的层级关系,可以根据package、module、类、方法来查找测试用例。】

image

4、Graphs:测试结果图形化,包括测试用例执行结果的分布图,优先级,耗时等。【图表模块,包括按照不同维度分析的各种图表(例如测试状态表分析,测试用例等级分析表,测试执行时间分析表等等)。】

image

5、Timeline:可以看到测试用例精确的测试时序(执行顺序),包括测试用例执行时间。【按执行时间分析模块,详细列出了各个测试用例的执行时间,你可以筛选出那些运行时间最长的测试用例进行优化。】

image

6、Behaviors:行为驱动,根据epic、feature、story来分组测试用例。【针对 BDD 驱动的测试用例进行分析(Behaviors)】

image

7、Packages:按照测试用例的package、module分组测试用例。【按照 Package 进行分析(Packages)】

Package 模块列出了按照 Package 维度进行分析的详细图表。

image

5、allure代码实例

# coding:utf-8

import pytest
import allure


# 测试函数
@allure.step("字符串相加:{0},{1}")  # 测试步骤,可通过format机制自动获取函数参数
def str_add(str1, str2):
    print("hello")
    if not isinstance(str1, str):
        return "%s is not a string" % str1
    if not isinstance(str2, str):
        return "%s is not a string" % str2
    return str1 + str2


# @llure.environment(host="172.6.12.27", test_vars=paras)
@allure.severity("critical")  # 优先级,包含blocker, critical, normal, minor, trivial 几个不同的等级
@allure.feature("测试模块_demo1")  # 功能块,feature功能分块时比story大,即同时存在feature和story时,feature为父节点
@allure.story("测试模块_demo2")  # 功能块,具有相同feature或story的用例将规整到相同模块下,执行时可用于筛选
@allure.issue("BUG号:123")  # 问题表识,关联标识已有的问题,可为一个url链接地址
@allure.testcase("用例名:测试字符串相等")  # 用例标识,关联标识用例,可为一个url链接地址
@pytest.mark.parametrize("para_one, para_two",  # 用例参数
                         [("hello world", "hello world"),  # 用例参数的参数化数据
                          (4, 4),
                          ("中文", "中文")],
                         ids=["test ASCII string",  # 对应用例参数化数据的用例名
                              "test digital string",
                              "test unicode string"])
def test_case_example(para_one, para_two):
    """用例描述:测试字符串相等
    :param para_one: 参数1
    :param para_two: 参数2
    """

    # 获取参数
    paras = vars()
    # 报告中的环境参数,可用于必要环境参数的说明,相同的参数以后者为准
    allure.environment(host="172.6.12.27", test_vars=paras)
    # 关联的资料信息, 可在报告中记录保存必要的相关信息
    allure.attach("用例参数", "{0}".format(paras))
    # 调用测试函数
    res = str_add(para_one, para_two)
    # 对必要的测试中间结果数据做备份
    allure.attach("str_add返回结果", "{0}".format(res))
    # 测试步骤,对必要的测试过程加以说明
    with pytest.allure.step("测试步骤2,结果校验 {0} == {1}".format(res, para_one + para_two)):
        assert res == para_one + para_two, res


if __name__ == '__main__':
    # 执行,指定执行测试模块_demo1, 测试模块_demo2两个模块,同时指定执行的用例优先级为critical,blocker
    pytest.main(['--allure_stories=测试模块_demo1, 测试模块_demo2', '--allure_severities=critical, blocker'])

allure测试报告的特性

【ENVIRONMENT】

一、功能描述

原因:allure 报告首页展示的 "环境" 默认不显示“没有环境变量” 配置信息,所以导致allure测试报告不够美观,不够权威;

设置:为了让allure 报告首页展示的信息更全面,需要进行设置。设置方法如下:

image

二、设置步骤

1、旧版本设置方法

早期的 allure 1.x 版本可以用以下方式添加allure测试报告展示ENVIRONMENT环境变量:

import allure

# allure 添加 environment 配置
allure.environment(blog='https://www.cnblogs.com/xyztank/')
2、新版本设置方法(默认设置方式)

①创建文件

新版本的allure需要在allure报告的根目录创建 environment.properties文件【即allure测试报告原始数据文件夹里创建】,创建文件:

image

②在 environment.properties 文件中填充环境变量:

Browser=Chrome
Browser.Version=81.0.4044.92
Stand=Production
ApiUrl=127.0.0.1/login
systemVersion=win10
pythonVersion=3.7.0
allureVersion=2.13.15
baseUrl=https://www.cnblogs.com/hls-code/
projectName=MyProject
author=hls

【注意】这里为 key=value 的格式。这个文件你可以通过编写相关函数动态在执行测试用例脚本时获取每次执行时的真实值,然后写入 environment.properties 文件。

③与①②相似,在allure测试报告原始数据目录创建 environment.xml 文件:

<environment>
    <parameter>
        <key>Browser</key>
        <value>Chrome</value>
    </parameter>
    <parameter>
        <key>Browser.Version</key>
        <value>81.0.4044.92</value>
    </parameter>
    <parameter>
        <key>Stand</key>
        <value>Production</value>
    </parameter>
        <parameter>
        <key>ApiUrl</key>
        <value>127.0.0.1/login</value>
    </parameter>
        <parameter>
        <key>python.Version</key>
        <value>3.7.2</value>
    </parameter>
</environment>

【注意】 environment.properties 文件或者 environment.xml 文件中不可以填写中文,会乱码;如下图中文乱码:

image

allure报告:

image

三、复制 environment.properties 配置文件

在执行pytest命令生成allure报告的时候,经常会加 --clean-alluredir参数,其功能即是清除之前创建的allure测试报告原始数据(会将测试报告原始数据文件夹下的文件全部清空),即此命令同样会将 environment.properties 文件删除。

①为防止 environment.properties 文件被删掉,可以先把该目录放在项目根目录。

②测试用例执行后< addopts = -v --tb=no --alluredir=./report/tmp --clean-alluredir >,然后在生成allure测试报告之前< allure generate report/tmp -o report/allure-report -c report/allure-report >,

③将 environment.properties 文件再copy 到 allure测试报告原始数据目录。

【测试用例执行前,/report/tmp测试报告原始数据文件夹下没有 environment.properties 文件;测试用例执行后,/report/tmp测试报告原始数据文件夹形成新的测试报告原始数据即最新的用例执行结果,此时在将 environment.properties 文件添加到/report/tmp测试报告原始数据文件夹中】

详细操作命令:
#第一步执行测试
pytest test01.py -v -s --alluredir=F:/test_code_project/opra-upl/report/allure  --clean-alluredir --reruns 3
 
#第二步复制环境变量文件【从项目根目录复制到测试报告原始数据目录】
copy environment.properties report\tmp\

#第三步生成报告
allure generate report\tmp -o report\allure-report -c report\allure-report

#第四步本地查看报告
allure open report\allure-report
操作截图:

image

【显示历次运行的 trends(测试用例执行结果趋势)】

同样地,默认生成的 Allure 报告不包括历次运行信息 Trends;如果想添加历次运行信息到Trends,步骤如下:

①执行完测试后,不要执行 allure serve 命令【不需要直接将allure测试报告原始数据开启allure服务】,转而执行 allure generate。【首先生成测试报告】: allure generate ./allure_results ,这个操作会生成一个新的文件夹,名为 allure-report。

②拷贝 allure-report 文件夹下的 history 文件夹,及其子文件夹到allure测试报告原始数据文件夹中。

③第二次执行测试脚本并生成测试报告即可把历史记录带到 Allure 报告中。: allure serve ./allure_results

④执行测试用例脚本过后,打开 Allure 测试报告,你将看到 Trend 的内容。

【为 Allure 测试报告添加执行人】

同样地,默认的 Allure 测试报告也不显示 Executor;这是因为 Executor 通常是由 Builder 自动生成的,比如通过 Jenkins pluginAllure Jenkins Plugin 来生成。

关于如何使用 Allure Jenkins Plugin 配置 Allure:查看链接

当然也可以自己生成,步骤如下:

①首先创建名称为executor.json的文件,内容如下:

{
  "name": "iTesting",

  "type": "jenkins",

  "url": "http://helloqa.com",

  "buildOrder": 3,

  "buildName": "allure-report_deploy#1",

  "buildUrl": "http://helloqa.com#1",

  "reportUrl": "http://helloqa.com#1/AllureReport",

  "reportName": "iTesting Allure Report"
}

②然后,拷贝 executor.json 文件到 allure报告原始数据文件夹中去。(详细看ENVIRONMENT环境设置,操作相似)

③最后, 执行如下命令即可: allure serve ./allure_results

④执行完后,打开 Allure 测试报告,你将看到 Executor 的信息

【Allure 测试报告实现错误自动截图】

在测试时,特别是 UI 自动化测试错误发生时,我们会想通过系统截图的方式,来更清楚地了解系统当时的状态,于是错误截图就很必要。

使用 Allure 自动实现错误截图,参考 conftest.py 这个文件中定义的函数: pytest_runtest_makereport

import allure

import pytest

def pytest_addoption(parser):
    parser.addoption(
        "--flag", action="store_true", default=False, help="set skip or not")
    parser.addoption(
        "--browser", action="store", default="Firefox", help="set browser")

@pytest.fixture(scope='session')
def get_flag(request):
    return request.config.getoption('--flag')

@pytest.fixture(scope='session')
def get_browser(request):
    return request.config.getoption('--browser')

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):

    """
      本hook用于制作测试报告
      :param item:测试用例对象
      :param call:测试用例的测试步骤
              执行完常规钩子函数返回的report报告有个属性叫report.when
                when=’setup’ 代表返回setup 的执行结果
                when=’call’ 代表返回call 的执行结果
      :return:
    """

    outcome = yield
    rep = outcome.get_result()
    if (rep.when == "call" or rep.when == 'setup') and (rep.failed or rep.skipped):
        try:
            if "initial_browser" in item.fixturenames:
                web_driver = item.funcargs['initial_browser']
            else:
                # 如果找不到driver,则直接return
                return
            allure.attach(web_driver.get_screenshot_as_png(), name="wrong picture",
                          attachment_type=allure.attachment_type.PNG)
        except Exception as e:
            print("failed to take screenshot".format(e))

代码简单介绍:

在这个代码中,我分别定义了两个命令行参数 flag 和 browser。

flag:只有两个值 True 和 False,当用户不传 flag 参数时,默认为 False,当用户传递 flag 时,值为 True。

browser:代表要启用的浏览器,默认是 Firefox 浏览器。

对应地,get_flag 和 get_browser 这两个 fixture 就是分别用来取 flag 和 browser 的值。

被装饰器 @pytest.hookimpl(tryfirst=True, hookwrapper=True) 装饰的函数 pytest_runtest_makereport,是 pytest 提供的 Hook 函数,它有以下两个作用:

可以获取到测试用例不同执行阶段的结果(setup,call,teardown);

可以获取钩子方法的调用结果(yield 返回一个 result 对象)和调用结果的测试报告(返回一个 report 对象,即 _pytest.runner.TestReport)。

①首先,通过如下命令运行所有测试:

pytest -s  -v --alluredir=./allure_results --flag --browser chrome

②执行成功后,通过如下命令打开测试报告:

allure serve ./allure_results

③看到如下结果:

image

④点击图中的 “FEATURES BY STORIES”, 进入 Behaviors 页面,展开后你可以看到下图:

image

⑤可以看到,第 3 条测试用例执行失败了,截图信息也自动保存了。

【通过 Allure 测试报告查看测试用例详情】

Allures 生成后,我们可以通过点击左侧的导航栏,进入到不同的页面,观察 Allure 的不同维度的测试分析。这里不再一一阐述,我重点分享一下如下页面:

image

点击任何一条测试用例,都能在 OverView 里看到这个测试用例的详细情况,包括测试所属的模块、测试用例的重要程度,以及这个测试用例对应 Jira 的 story 等信息,非常清晰明了。

【自研的测试报告】

除了用 Allure 来生成测试报告外,你的测试报告也可以自研,那么自研怎么操作呢?

最简单的方式是你写一个 HTML 模板,然后把涉及运行信息的要素,比如运行环境、执行人、测试成功条数、测试失败条数定义为变量,然后在你的自研框架运行完后,把这些变量替换为真实的值即可。

至于图表的操作,你可以使用 hicharts、echarts 等图表可视化工具完成。因为这里涉及 HTML 还有一些前端的代码知识,就不再详细介绍。

image

posted @ 2022-08-22 15:27  观棋不雨  阅读(1192)  评论(0编辑  收藏  举报