我们需要测试报告
测试用例总会执行完毕,我们也总会需要一个总结本轮测试的报告来告诉我们测试的质量如何,从而为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。
我们期待遇到一个这样的测试报告
- 标注每次执行的测试时间、环境、轮次
- 一眼明了的测试结果
- 清晰可查的测试过程
- 多个维度的缺陷统计分析
- 配置灵活
- 易上手使用&省心
- ...
于是,allure report 进入了我们的视野 🎉
Allure简介 🤔
什么是allure:
什么是Allure:
同单词 allure 一样,Allure也是一个充满魅力处处是惊喜的报告框架。
A flexible lightweight multi-language test report tool designed to create fancy and clear testing reports.
一种灵活的轻量级多语言测试报告工具,旨在创建优质又清晰的测试报告。[官网]
开始上手试试吧
一、安装
brew install allure
💡 Allure 安装完成之后,在控制台输入
allure --version
查看是否安装成功,如果提示找不到命令,按照以下方式配置:
- 下载 Allure 安装包
- 解压
- 将 bin 路径添加到 bash_profile 或 bashrc 中,然后
source bash_profile or bashrc file
- 执行命令
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 列表
-
generate :
generate _[options] _ allure 结果目录
用于生成 allure 的html 报告 :
pytest testcase.py --alluredir= <结果目录>
-
open :
open _[options] _allure报告目录
打开allure 报告(打开 generate 命令生成的报告):
allure generate -o <./allure-report>
-
serve :
serve _[options]_ allure 结果目录
启动 allure 服务,打开 allure 报告:
pytest testcase.py --alluredir= ./allure
三、生成报告
要使Allure能够在测试执行期间收集测试结果,只需添加 --alluredir 选项,并提供数据存储路径即可(pytest 提供了 --clean-alluredir 参数可以清空 allure 报告生成的目录)
pytest test_case.py --alluredir=../allure_result
我们可以得到:一堆json、txt文件....
因此我们还需要利用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 到浏览器中自行打开。
四、查看报告
- Overview:总览
- Categories:类别,默认是分了failed和error,凡是执行结果是其中一个的都会被归到类里面,可以通过这里快捷查看哪些用例是failed和error的
- Suites:测试套,就是所有用例的层级关系,根据package、module、class、function来查找用例
- Graphs:图表,包括用例执行结果的分布图,优先级,耗时等
- Timeline:时间刻度,可以看到测试用例精确的测试时序(执行顺序),包括每个case的执行时间
- Behaviors:功能,根据epic、feature、story来分组测试用例(敏捷常用词)
- Packages:包,按照package、module来分组测试用例
这是一个最基础的测试报告样式。我们发现,上面记录了case的执行时长,通过率和执行结果,这已经基本具备了测试报告的主要功能。
很明显,比起上面那个光秃秃的测试报告,我们更想要的报告长这个样子:
Allure Report 配置
如果我们想记录测试用例链接、操作现场记录(截图、文字、附件)、测试环境、测试用例分类归纳等等数据,那么就需要来了解更多Allure的特性。
Environment(环境)
记录的是本次测试的运行环境参数,但要注意,这里的环境是自己手动添加的,不是Allure自动生成的。
Enviromment有两种添加的方法:environment.properties
或 environment.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>
Categories(分类)
用于对测试结果进行分类。默认情况下,有两类缺陷:
- Product defects 产品缺陷(测试结果:failed)
- 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
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')
pytest-allure特性 [链接]
- 预期失败:@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
- 跳过case:@pytest.mark.skipif,在allure中会特殊标记为skip状态,并增加tag
- @pytest.fixture:allure跟踪每个fixture的调用,并详细显示调用的参数、正确的调用顺序。
- @pytest.mark.parametrize:allure会详细展示使用参数化生成的case
Allure带来的特性
除了上述pytest的特性(parametrize、xfail、skip)之外,Allure自己本身也有强大的特性可以在pytest中使用。
如果希望在报告中看到测试步骤,测试附加信息,可以使用注解的方式直接加到case上。
常用的allure注解有:
- @allure.title:case标题
- @allure.description**, **@allure.description_html ,""" 描述 """
- @allure.step**, **@allure.attach,@allure.attach.file
allure.attach(body, name, attachment_type, extension)
- body:要显示的内容(附件)
- name:附件名字
- attachment_type:附件类型,是 allure.attachment_type 里面的其中一种
- extension:附件的扩展名(比较少用)
- @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)
- @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("动态标题")
- 重试/历史记录:Allure会保留在单个测试运行期间重新执行的测试的信息,以及一段时间内测试执行的历史记录。
Allure标记装饰器
- @allure.epic:敏捷里面的概念,定义史诗,往下是 feature
- @allure.feature:功能点的描述,理解成模块往下是 story
- @allure.story:故事,往下是 title
注解@allure.feature与@allure.store的关系
- feature相当于一个功能,一个大的模块,将case分类到某个feature中,报告中「Behaviors(功能)」中显示,相当于 testsuite。
- story相当于对应这个功能或者模块下的不同场景,分支功能,属于feature之下的结构。
- 如果不加 @allure.feature、@allure.story 时,在Behaviors栏目下,测试用例都不会分类显示,当用例多的时候可能看的花里胡哨
- 可以直接在pytest执行是加入参数 --allure-epics、--allure-features、--allure-stories 筛选case
- @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