关于自动化报告生成工具 Allure 的最全面介绍

我们需要测试报告

测试用例总会执行完毕,我们也总会需要一个总结本轮测试的报告来告诉我们测试的质量如何,从而为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。

我们期待遇到一个这样的测试报告

  • 标注每次执行的测试时间、环境、轮次
  • 一眼明了的测试结果
  • 清晰可查的测试过程
  • 多个维度的缺陷统计分析
  • 配置灵活
  • 易上手使用&省心
  • ...

于是,allure report 进入了我们的视野 🎉

Allure简介 🤔

什么是allure:

image.png

什么是Allure:

同单词 allure 一样,Allure也是一个充满魅力处处是惊喜的报告框架。

A flexible lightweight multi-language test report tool designed to create fancy and clear testing reports.
一种灵活的轻量级多语言测试报告工具,旨在创建优质又清晰的测试报告。[官网]

image.png
image.png

开始上手试试吧

一、安装

brew install allure

💡 Allure 安装完成之后,在控制台输入allure --version查看是否安装成功,如果提示找不到命令,按照以下方式配置:

  1. 下载 Allure 安装包
  2. 解压
  3. 将 bin 路径添加到 bash_profile 或 bashrc 中,然后 source bash_profile or bashrc file
  4. 执行命令 ln -s /path/to/your/bin/allure /usr/bin/allure,在 /usr/bin/ 下面建立一个软链接。
$ pip install allure-pytest

二、Allure命令行参数

终端输入 allure -h 可以获取allure命令的具体信息

allure [options] [command] [command options]

options 列表

--help 命令行帮助文档
-q, --quiet         切换至安静模式(Default: false)
-v, --verbose       切换至冗长模式(Default: false)
--version           版本信息(Default: false)

command 列表

  • generategenerate _[options] _ allure 结果目录

用于生成 allure 的html 报告 : pytest testcase.py --alluredir= <结果目录>

1896874-20201028123446680-921838785.png

  • openopen _[options] _allure报告目录

打开allure 报告(打开 generate 命令生成的报告):allure generate -o <./allure-report>

1896874-20201028141707575-281214400.png

  • serve : serve _[options]_ allure 结果目录

启动 allure 服务,打开 allure 报告:pytest testcase.py --alluredir= ./allure

1896874-20201028123446680-921838785.png

三、生成报告

要使Allure能够在测试执行期间收集测试结果,只需添加 --alluredir 选项,并提供数据存储路径即可(pytest 提供了 --clean-alluredir 参数可以清空 allure 报告生成的目录)

pytest test_case.py --alluredir=../allure_result

我们可以得到:一堆json、txt文件....


image (1).png

因此我们还需要利用allure命令行参数把数据整合成能查看的报告;

# 方法一:
# 直接生成HTML报告,这个会直接在线打开报告
allure serve ../allure_result


# 方法二:
# 1. 指定生成报告的路径
 allure generate ../allure_result -o ../allure_report --clean

# 2. 启动本地服务生成链接查看报告
allure open -h 127.0.0.1 -p 8883 /tmp/allure_report

💡 使用方法一 后,会自动启动浏览器进入对应的报告页面。如果浏览器没有自动启动,可复制在终端中生成的http://localhost:8883/index.html 到浏览器中自行打开。

image (2).png

四、查看报告

  • Overview:总览
  • Categories:类别,默认是分了failed和error,凡是执行结果是其中一个的都会被归到类里面,可以通过这里快捷查看哪些用例是failed和error的
  • Suites:测试套,就是所有用例的层级关系,根据package、module、class、function来查找用例
  • Graphs:图表,包括用例执行结果的分布图,优先级,耗时等
  • Timeline:时间刻度,可以看到测试用例精确的测试时序(执行顺序),包括每个case的执行时间
  • Behaviors:功能,根据epic、feature、story来分组测试用例(敏捷常用词)
  • Packages:包,按照package、module来分组测试用例
image (4).png
image (3).png

这是一个最基础的测试报告样式。我们发现,上面记录了case的执行时长,通过率和执行结果,这已经基本具备了测试报告的主要功能。
很明显,比起上面那个光秃秃的测试报告,我们更想要的报告长这个样子:


image (5).png
image (6).png

Allure Report 配置

如果我们想记录测试用例链接、操作现场记录(截图、文字、附件)、测试环境、测试用例分类归纳等等数据,那么就需要来了解更多Allure的特性。

Environment(环境)

记录的是本次测试的运行环境参数,但要注意,这里的环境是自己手动添加的,不是Allure自动生成的。
Enviromment有两种添加的方法:environment.propertiesenvironment.xml。不管是那种格式的文件,只要放入到</allure_results>(这个目录是生成最后的html报告之前,生成依赖文件的目录)目录下即可。

app_name=sentence
app_version=1.0.2
device_name=HUAWEI
device_version=10
<environment>
    <parameter>
        <key>app_name</key>
        <value>sentence</value>
    </parameter>
    <parameter>
        <key>app_version</key>
        <value>1.0.2</value>
    </parameter>
    <parameter>
        <key>device_name</key>
        <value>HUAWEI</value>
    </parameter>
    <parameter>
        <key>device_version</key>
        <value>10</value>
    </parameter>
</environment>
image (7).png

Categories(分类)

用于对测试结果进行分类。默认情况下,有两类缺陷:

  1. Product defects 产品缺陷(测试结果:failed)
  2. Test defects 测试缺陷(测试结果:error/broken)

我们也可以创建自定义缺陷分类,将 categories.json 文件添加到</tmp/my_allure_results>目录即可(和上面environment.properties放同一个目录)

[
    {
        "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:测试用例运行的错误堆栈信息,默认是 .* ,也是通过正则去匹配。

Flaky(易脫落的碎屑)

顾名思义,不稳定的case。使用时,直接在类或者方法上加 @Flaky

  • 简单来说就是:有可能前一天还运行成功,第二天就运行失败,Flaky可以理解成“不稳定”。
  • 标记成Flaky的好处就是:当用例失败的情况下,我们能获取更关于这个case的执行具体信息;如果不标记为Flaky的话,可能就要skip这些测试。
from flaky import flaky


class TestAllure:
    @flaky
    def test_generate_allure(self):
        """
        这里是description:简单生成一个测试报告试试!
        :return:
        """
        assert 1 + 1 == 3
image (8).png

Allure 特性

基础报告

import pytest


def test_success():
    """this test succeeds"""
    assert True


def test_failure():
    """this test fails"""
    assert False


def test_skip():
    """this test is skipped"""
    pytest.skip('for a reason!')


def test_broken():
    raise Exception('oops')
image (9).png

pytest-allure特性 [链接]

  1. 预期失败:@pytest.mark.xfail,在allure中会增加特殊标记
@pytest.mark.xfail(condition=lambda: True, reason='我希望这个case失败')
def test_xfail_expected_failure():
    """this test is an xfail that will be marked as expected failure"""
    assert False


@pytest.mark.xfail(condition=lambda: True, reason='我希望这个case失败')
def test_xfail_unexpected_pass():
    """this test is an xfail that will be marked as unexpected success"""
    assert True
  1. 跳过case:@pytest.mark.skipif,在allure中会特殊标记为skip状态,并增加tag
  2. @pytest.fixture:allure跟踪每个fixture的调用,并详细显示调用的参数、正确的调用顺序。
  3. @pytest.mark.parametrize:allure会详细展示使用参数化生成的case

Allure带来的特性

除了上述pytest的特性(parametrize、xfail、skip)之外,Allure自己本身也有强大的特性可以在pytest中使用。
如果希望在报告中看到测试步骤,测试附加信息,可以使用注解的方式直接加到case上。
常用的allure注解有:

  1. @allure.title:case标题
  2. @allure.description**, **@allure.description_html ,""" 描述 """
  3. @allure.step**, **@allure.attach,@allure.attach.file

allure.attach(body, name, attachment_type, extension)

  • body:要显示的内容(附件)
  • name:附件名字
  • attachment_type:附件类型,是 allure.attachment_type 里面的其中一种
  • extension:附件的扩展名(比较少用)
    image (10).png
  1. @allure.testcase, @allure.issue, @allure.link** **

主要是用于将allure报告和测试管理系统集成,可以更快速的跳转到测试用例地址

# issue()和testcase()其实调用的也是link(),只是link_type不一样

def link(url, link_type=LinkType.LINK, name=None):
    return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))


def issue(url, name=None):
    return link(url, link_type=LinkType.ISSUE, name=name)


def testcase(url, name=None):
    return link(url, link_type=LinkType.TEST_CASE, name=name)
  1. @allure.dynamic 在测试用例执行过程中动态指定标题和描述等标签的方法;如: allure.dynamic.description allure.dynamic.title

上面有的方法都能进行动态修改,如:

allure.dynamic.feature
allure.dynamic.link
allure.dynamic.issue
allure.dynamic.testcase
allure.dynamic.story
allure.dynamic.title
allure.dynamic.description
@allure.title("装饰器标题")
def test_1():
    print(123)
    allure.dynamic.title("动态标题")
  1. 重试/历史记录:Allure会保留在单个测试运行期间重新执行的测试的信息,以及一段时间内测试执行的历史记录。

Allure标记装饰器

  1. @allure.epic:敏捷里面的概念,定义史诗,往下是 feature
  2. @allure.feature:功能点的描述,理解成模块往下是 story
  3. @allure.story:故事,往下是 title

注解@allure.feature与@allure.store的关系

  1. feature相当于一个功能,一个大的模块,将case分类到某个feature中,报告中「Behaviors(功能)」中显示,相当于 testsuite。
  2. story相当于对应这个功能或者模块下的不同场景,分支功能,属于feature之下的结构。
  3. 如果不加 @allure.feature、@allure.story 时,在Behaviors栏目下,测试用例都不会分类显示,当用例多的时候可能看的花里胡哨
  4. 可以直接在pytest执行是加入参数 --allure-epics、--allure-features、--allure-stories 筛选case
  1. @allure.severity:case的重要性级别
  • blocker:阻塞缺陷(功能未实现,无法下一步)
  • critical:严重缺陷(功能点缺失)
  • normal: 一般缺陷(边界情况,格式错误)
  • minor:次要缺陷(界面错误与ui需求不符)
  • trivial: 轻微缺陷(必须项无提示,或者提示不规范)

pytest -s -v testcase.py --allure-serverities normal,critical

总结

  • allure 是一个轻量级、灵活的、支持多语言的测试报告工具。
  • allure 是一个多平台的、奢华的report框架。
  • 可以为开发者/测试人员提供详尽的测试报告、测试步骤、log等信息;也可以提供高品质的统计报告。

参考

allure 官网:https://docs.qameta.io/allure/#_about
pytest API:https://docs.pytest.org/en/latest/reference/reference.html#id30
小菠萝测试笔记:https://www.cnblogs.com/poloyy/category/1690628.html
本文用到的项目:pythonProject.zip

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容