1.关于Allure
Allure框架是一个灵活轻量级多语言测试报告工具,它不仅可以以WEB的方式展示简介的测试结果,而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息。
Allure报告简化了常见缺陷的统计:失败的测试可以分为BUG和被中断的测试,还可以配置日志、步骤、fixture、附件、计时、执行历史以及与BUG管理系统集成,所以,通过以上配置,所有负责的开发人员和测试人员可以尽可能的掌握测试信息。
2.Allure安装
- 1.下载JDK,下载地址如下所示:
https://www.oracle.com/java/technologies/downloads/
- 2.设置环境变量
以Windows为例,如下所示:
JAVA_HOME=D:\Program Files\Java
Path中添加%JAVA_HOME%\bin
在命令行中分别输入以下命令,不报错,即代表设置成功
C:\Users\admin>java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
C:\Users\admin>javac -version
javac 17.0.1
- 3.下载Allure命令行,下载地址如下所示:
https://github.com/allure-framework/allure2/releases/
- 4.将下载到本地的allure压缩包解压到指定目录,并添加相应的环境变量
Path=D:\Program Files\Allure\allure-2.16.0\bin
在命令行中输入allure,不出现报错即可
Usage: allure [options] [command] [command options]
Options:
--help
Print commandline help.
-q, --quiet
Switch on the quiet mode.
Default: false
...
3.Allure用法
3.1 语法格式
allure [options] [command] [command options]
3.2 常用option和command
-
Options
- -q, --quiet:切换到静默模式,默认关闭
- -v, --verbose:切换详细日志模式,默认关闭
-
Commands
- generate:生成allure的HTML报告
- -c, --clean:在生成新报告前,清理之前生成报告的目录,默认关闭
- --config:Allure命令行配置文件路径,如果指定将覆盖--profile和--configDirectory所设定的值
- --configDirectory:Allure命令行配置文件目录,默认值为: ALLURE_HOME目录
- --profile:Allure命令行配置文件
- -o, --report-dir, --output:指定生成报告的目录,默认allure-report
- serve:启动serve并查看报告
- 基本语法:serve [options] allure结果目录
- --config:Allure命令行配置文件路径,如果指定将覆盖--profile和--configDirectory所设定的值
- --configDirectory:Allure命令行配置文件目录,默认值为: ALLURE_HOME目录
- --profile:Allure命令行配置文件
- -h, --host:指定访问报告的web服务器地址
- -p, --port:指定访问报告的web服务器地端口,默认为0
- open:查看报告
- 基本语法:open [options] allure报告目录
- -h, --host:指定访问报告的web服务器地址
- -p, --port:指定访问报告的web服务器地端口,默认为0
1.generate常用参数主要为-c和-o
2.open常用参数主要为-h和-p
4.Allure报告结构
- Overview
报告总览
- Categories
类别,允许用户创建自定义的类别。默认分为失败和错误,在执行结果是其中一类时则被归到相应的类中。
- Suites
测试套件,即所有用例的层级关系,可以按package/module/class/method进行查找
- Graphs
测试结果图形化,包含测试用例的运行结果分布图、耗时、优先级等
- Timeline
时序图,将测试用例的执行顺序和测试时间以可视化形式展现出来
- Behaviors
行为驱动,根据Epic、Feature、Story来对测试用例进行分组
- Packages
用例按Package进行分组,根据测试结果按不同的Package进行分组,并以树形结构进行展示
5.Allure特性
5.1 Flaky
该特性用来标识不够稳定的测试用例集,即有些用例运行时,时而成功时而失败。其用意主要如下所示:
- 当用例失败的情况下,能够获取足够详细的信息
- 不标记为Flaky的话,可能就要禁用这些测试
用法如下所示:
@Flaky
public void aTestWhichFailsFromTimeToTime {
...
}
5.2 Environment
Environment表示环境变量参数,用来显示本次测试运行环境的参数。在生成allure-result结果前,通过创建environment.properties或environment.xml文件,并把文件放置到allure-result目录中。
environment.properties
Browser=Chrome
Browser.Version=95.0
Stand=Production
environment.xml
<environment>
<parameter>
<key>Browser</key>
<value>Chrome</value>
</parameter>
<parameter>
<key>Browser.Version</key>
<value>95.0</value>
</parameter>
<parameter>
<key>Stand</key>
<value>Production</value>
</parameter>
</environment>
environment.properties和environment.xml不允许存在中文。
5.3 Categories
默认分类分为两种,如下所示:
- Product defects:产品缺陷,测试结果为失败(failed tests)
- Test defects:测试缺陷,测试结果为错误(broken tests)
除了默认分类之外,也可以自定义创建分类。通过创建categories.json文件,在生成allure-result结果前,提前放置到该目录即可。
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(可选项):测试用例运行的错误堆栈信息,默认是 .* ,通过正则进行匹配
6.Allure与Pytest集成
6.1 Allure行为驱动
allure除了支持Pytest自带的特性之外(fixture、parametrize、xfail、skip),自身也有非常强大的特性,下面来详细介绍。
6.1.1 @allure.step
allure报告允许对每个测试用例的执行步骤进行详细说明,该功能通过@allure.step()装饰器来实现
@allure.step()只有一个参数,就是title
6.1.2 @allure.attach
allure报告支持添加附件并进行展示,可用以补充测试结果,第一种基本语法如下所示:
allure.attach(body, name, attachment_type, extension)
- body:要显示的附件内容
- name:附件名称
- attachment_type:附件类型,属于allure.attachment_type里面的一种
- extension:附件扩展名
allure.attachment_type主要有TEXT、CSV、HTML、XML、JSON、YAML、PCAP、PNG、JPG、SVG、GIF、BMP、MP4、OGG、WEBM、PDF等
第二种基本语法如下所示:
allure.attach.file(source, name, attachment_type, extension)
- source:上传文件所在路径
- 其他参数和上面参数一致
6.1.3 @allure.description
给用例添加详细的描述,常见语法有三种:
-
1.@allure.description(str)
-
2.在测试用例函数声明下方添加 """ """
-
3.@allure.description_html(str)
相当于传一个HTML代码组成的字符串,类似 allure.attach()中传HTML
方式一和方式二作用和效果是一样的
6.1.4 @allure.title
添加测试用例标题,支持占位符传递关键字参数(动态标题,结合(@pytest.mark.parametrize使用)
如果没有添加 @allure.title()的话,测试用例的标题默认就是函数名
6.1.5 @allure.link&@allure.issue&@allure.testcase
三个装饰器源码如下所示:
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)
- issue()和testcase()调用的也是link(),只是link_type不一样
- url:跳转的链接,必传参数
- name:显示在allure报告的名字,如果不传就是显示完整的链接
出现三个装饰器的原因是为了更好地将链接分类访问连接、Bug链接、测试用例链接
6.1.6 BDD标记装饰器
在pytest中,可以使用@pytest.mark进行标识,但并不会显示在allure报告上,而allure也提供了三种类型的标记装饰器,它们则是可以显示在allure报告上的,如下所示:
- @allure.epic:敏捷里面的概念,往下是 feature
- @allure.feature:功能点的描述,理解成模块往下是 story
- @allure.story:故事,往下是 title
1.story 是 feature 的子集,当测试用例有 @allure.feature、@allure.story 时,在报告上会先显示 feature,点开之后再显示 story
2.如果不加 @allure.feature、@allure.story 时,在Behaviors栏目下,测试用例都不会分类显示
用命令行方式运行时,可以指定运行某个story、feature、epic
--allure-epics
--allure-features
--allure-stories
6.1.7 @allure.severity
allure提供了用例级别,因此在allure报告可以清晰看到不同级别用例的缺陷数量。详细等级如下所示:
级别 | 含义 | 详细解释 |
---|---|---|
blocker | 阻塞缺陷 | 无法执行下一步操作等 |
critical | 严重缺陷 | 功能点缺失或直接崩溃等 |
normal | 一般缺陷 | 边界值问题,格式错误等 |
minor | 次要缺陷 | UI类错误等 |
trivial | 轻微缺陷 | 必填项无提示或提示信息不规范和统一等 |
6.2 Allure和Pytest安装
执行以下命令安装即可:
pip install -U allure-pytest pytest
6.3 Allure与Pytest集成示例
6.3.1 allure.step示例
示例代码如下所示:
import pytest
import allure
import os
@allure.step("这是第一步")
def inputUrl(url:str):
print(f"输入的网址为:{url}")
@allure.step(title="这是第二步")
def locateElement(xpath:str):
print(f"查找元素的xpath是{xpath}")
@allure.step("这是第三步")
def sendElement():
inputUsernameAndPasswd("Surpass","password")
@allure.step("这是第四步,{username},{password}")
def inputUsernameAndPasswd(username:str,password:str):
print(f"输入的用户名和密码分别为:{username},{password}")
@allure.step("这是第五步")
def test_login():
inputUrl("https://www.baidu.com")
locateElement('//*[@id="su"]')
sendElement()
生成结果如下所示:
01allure.step.png6.3.2 allure.attach示例
示例代码如下所示:
import pytest
import allure
import os
def attach01(body,name,attachment_type=allure.attachment_type.TEXT):
"""
附件为内容
"""
allure.attach(body,name,attachment_type=attachment_type)
def attach02(filePath,name,attachment_type=allure.attachment_type.TEXT):
"""
附件为文件
"""
allure.attach.file(filePath,name,attachment_type=attachment_type)
def test_attach01():
body = "<h3>方法一:测试allure附件内容为HTML</h3>"
name = "attach-01-test"
attach01(body,name,attachment_type=allure.attachment_type.HTML)
def test_attach02():
filePath=os.path.join(os.getcwd(),"attach","sample.png")
name="attach-02-test"
attach02(filePath,name,attachment_type=allure.attachment_type.PNG)
生成结果如下所示:
02allure.attach.png6.3.3 allure.description示例
示例代码如下所示:
import pytest
import allure
def test_allureDescription01():
"""这是一个allure.description示例01"""
assert (7+8)==15
@allure.description("这是一个allure.description示例02")
def test_allureDescription02():
assert (7+8)==15
@allure.description_html("""
<h2>这是一个
<font size=15>allure.description </font>示例03
</h2>
""")
def test_allureDescription03():
assert (7+8)==15
生成结果如下所示:
03allure.description.png6.3.4 allure.title示例
示例代码如下所示:
import pytest
import allure
@allure.title("登录")
@pytest.fixture(scope="session")
def loginData(request):
params=request.param
name=params.get("name","")
password=params.get("password","")
code=params.get("code","")
print(f"param is {name},{password},{code}")
yield name,password,code
@allure.title(f"登录成功")
@pytest.mark.parametrize("loginData",[
{"name":"Surpass","password":"123456","code":"SHCQ"},
{"name":"Diana","password":"20210227","code":"FKDT"}
],indirect=True)
def test_loginSucces(loginData):
name,password,code=loginData
body=f"用户名:{name},密码:{password},验证码:{code}"
name="allure.title.test"
allure.attach(body,name,attachment_type=allure.attachment_type.TEXT)
生成结果如下所示:
04allure.title.png6.3.5 allure.link&allure.issue&allure.testcase示例
示例代码如下所示:
import pytest
import allure
@allure.link("https://www.google.com")
def test_basicLink():
pass
@allure.link(url="https://www.surpassme.com",name="basicLink")
def test_basicLinkWithName():
pass
@allure.issue(url="https://www.baidu.com",name="issueLink")
def test_issueLink():
pass
@allure.testcase(url="https://www.zentao.net",name="testcaseLink")
def test_testcaseLink():
pass
生成结果如下所示:
05allute.link.png6.3.6 BDD标记装饰器示例
示例代码如下所示:
import pytest
import allure
@allure.step("第一步")
def firstStep():
print("这是第一步")
@allure.step("第二步")
def secondStep():
print("这是第二步")
@allure.step("第N步")
def nStep():
print("第N步")
@allure.epic("总体描述")
@allure.feature("测试模块A")
class TestEpicAndFeatureAndStory():
@allure.issue("http://www.surpamssme.com/issue/id=0227")
@allure.testcase("http://www.surpassme.com/testcase/id=0227")
@allure.title("功能A-用例-01")
@allure.story("测试功能A")
@allure.description("Surpassme 测试验证")
def test_CaseA01(self):
print("test_Case01")
firstStep()
secondStep()
@allure.story("测试功能A")
@allure.title("功能A-用例-02")
def test_CaseA02(self):
pass
@allure.story("测试功能A")
@allure.title("功能A-用例-03")
def test_CaseA03(self):
pass
@allure.story("测试功能B")
@allure.title("功能B用例-01")
def test_CaseB01(self):
pass
@allure.story("测试功能B")
@allure.title("功能B用例-03")
def test_CaseB02(self):
pass
生成结果如下所示:
06allute.epic-feature-story.png6.3.7 allure.severity
示例代码如下所示:
import allure
@allure.title("blocker")
@allure.severity("blocker")
def test_Case01():
pass
@allure.title("critical")
@allure.severity("critical")
def test_Case02():
pass
@allure.title("normal")
@allure.severity("normal")
def test_Case03():
pass
@allure.title("minor")
@allure.severity("minor")
def test_Case04():
pass
@allure.title("trivial")
@allure.severity("trivial")
def test_Case05():
pass
生成结果如下所示:
07allure.severity.png
网友评论