前面我们实现pytest-html模块的报告生成,虽然可以实现增强操作,但是其报告还是不是很直观,那么我们今天就来学习下allure报告吧,allure就是那种可以实现花里胡哨的,让你们领导喜欢的报告。我们技术人员其实注重的是数据,是结果,而不是花里胡哨的,但是领导一般喜欢,从这点也可以辨别你们的领导是技术型的还是管理型的~~~
小 木 正 文
——————————————
❶allure环境准备
——————————————
首先我们现在用的都是allure2版本了,以前老的版本使用pytest-allure-adpator插件完成的,但是这个已经跟不上时代了,并且里面缺少很多用例的描述性操作,网上有些教程大多数都是使用该版本的,所以后面操作会发现有些调用不出来。装了的同学记得将其进行卸载哦,因为与我们今天要讲的allure2版本是不兼容的,有冲突的。
通过pycharm进行下载两个包:allure-pytest、allure-python-commons。
安装好后则需要进行下载allure命令行工具。有很多同学无法找到这个官网的下载地址:
https://github.com/allure-framework/allure2/releases
下载完成之后,直接解压到本地电脑,然后找到bin目录进行配置到环境变量path中即可。
然后在dos中输入allure --help即可相应的帮助信息
如果提示不是内部或者外部命令则说明环境变量配置有问题哦~~~
——————————————
❷运行测试用例
——————————————
下面给出一个完整demo的测试用例代码
#-*- coding:utf-8 -*-#
#-------------------------------------------------------------------------
#ProjectName: Python2020
#FileName: TestCaseManager.py
#Author: mutou
#Date: 2020/7/26 15:51
#Description:
#--------------------------------------------------------------------------
import pytest
import allure
import sys
#实现测试用例管理策略设计
#@pytest.mark.xfail #可以应用于断言的操作,如果执行到这里测试人员可以自定义让其设定是一个失败的结果,可以等价在测试过程中
#添加判定pytest.xfail方法,同样可以根据条件进行设定以及设定原因
def test_add_5(get_cal):
# if get_cal.c:
# pytest.xfail("c属性实现初始化赋值操作")
assert get_cal.add_1(1,1)==2
@pytest.mark.xfail(sys.version_info>(3,8),reasnotallow="当前版本小于3.8")
#此形式执行会产生四种状态:passed/xpassed(X)/failed/xfail(x)
def test_add_1(get_cal):
assert get_cal.add_1(1,0)==2
#除了直接跳过当前用例以外,还可以通过设定跳过的条件完成,例如:当前的操作系统/当前的python版本等3.8<那么就不执行,如果大于3.8的版本那就执行
@pytest.mark.skipif(sys.version_info>(3,8),reasnotallow="当前版本小于3.8")
#其实第一个参数要求是字符串类型bool表达式那么reason可以不声明,但是如果直接使用bool表达式的话,那么reason参数必须声明
#实际等价于eval("sys.version_info>(3,8)") 将该字符串转换成bool表达式执行
def test_add_2(get_cal):
assert get_cal.add_1(1,1)==2
#但是minus方法源码还没有实现,所以先设定好了测试用例,但是当前情况不想执行它,可以通过标记skip完成
@allure.title("这是减法浮点运算")
@pytest.mark.skip(reasnotallow="该方法开发还没有实现")
def test_minus_3(get_cal):
"""
:param get_cal:测试固件中所传入的参数
:return: 无返回值
"""
assert get_cal.minus(2,1)==4
#添加对应的附件
@allure.epic("一级别目录")
@allure.feature("二级目录")
@allure.story("三级目录")
@allure.title("这是参数化操作a:{a},b:{b},c:{sum}")
@allure.testcase("http://lcoahost:XXXX-1",name="登陆成功") #可以指定当前测试用例与功能的测试用例对应
@allure.issue("http://localhost:XXXX") #实现缺陷的关联
@allure.step("输入a,输入b,求和") #添加测试用例的步骤
@allure.severity(allure.severity_level.BLOCKER)
@allure.link("http://localhost:5858") #定义一个连接,在报告中进行显示 外部连接地址,比如对应需求的链接
@pytest.mark.parametrize("a,b,sum",[(1, 1,2),pytest.param(2,2,4,marks=pytest.mark.xfail(reasnotallow="该组参数功能还没实现"))])
def test_add_4(get_cal,a,b,sum):
assert get_cal.add_1(a,b)==sum
@allure.epic("这是一个较大的story")
@allure.feature("测试加法方法的测试类")
class TestAdd():
@allure.story("第一个故事")
@allure.title("test_add2")
def test_add_2(self,get_cal):
assert get_cal.add_1(1, 1) == 2
@allure.story("第二个故事")
def test_add_3(self,get_cal):
assert get_cal.add_1(1, 1) == 2
if __name__ == '__main__':
pytest.main()
运行测试用例,在dos中先使用命令执行生成结果目录,
pytest 测试用例模块所在路径 --alluredir 报告所需要生成的目录路径
同时也可以直接配置到pycharm中进行运行,例如:pycharm中配置,
执行后结果:
这个是生成多个的json格式文件,我们一个一个去看的太不友好了,过于麻烦,所以我们肯定需要进一步处理这个数据的
——————————————
❸对生成allure结果数据处理
——————————————
实际对allure结果数据处理有以下几种不同的实现方式:
1.直接通过命令启动allure服务即可,命令如下:
allure server 刚才所生成json的目录路径
启动服务后,会自动分配一个端口,直接使用默认浏览器打开
生成报告结果如下:
2.可以使用命令将json格式的数据生成html报告,然后自己部署到容器中进行打开也可以,具体命令如下:
allure generate allure所生成json数据的路径 -o 需要生成html报告的路径
然后选择index.html进行右键选择Open in Browser,然后选择对应的浏览器打开即可获取到跟上面报告结果一样的效果。
上面是一种打开方式,不能够直接进入html目录,通过浏览器直接打开index.html文件。否则结果如下:
注意:生成的html文件夹中拥有多个文件夹,该目录实际是一个web服务目录,需要通过服务进行发布才能够访问网站正常,不能够直接本地打开index.html页面这样的话不会自动加载数据,可以通过allure命令进行启动服务。
另外还可以通过open命令进行打开html目录报告,具体命令如下:
allure open allure所生成额html目录
open命令其还可以携带参数-h即对应的主机地址、ip地址,-p即端口自定义,这是使用自带的jetty容器进行发布的服务。
第三种方式:通过自定义容器发布,我们的容器有很多,例如:jetty、jboss、WebSphere、Tomcat等等。那么我今天给大家讲一款非常简单、小巧的容器anywhere,直接使用npm命令进行安装即可。
首先,之前我们配置过npm的环境变量,还记得吧,就是我们需要进行下载nodejs模块的时候,具体这里不多讲了,看前面的文章吧。
直接在dos中安装命令:
npm install anywhere -g
安装完成后
我是已经装过的,所以给出的提示是更新结果,你们是安装成功结果的。
然后切换到html目录,直接使用命令,同样可以添加参数-h和-p
然后会自动弹出一个浏览器页面,与上面的结果一样。
——————————————
❹allure描述用例详解
——————————————
前面我们已经可以完美的实现pytest+allure结合了,但是allure的具体应用我们还一无所知,那么后面我们就一点一点来学习吧。
你们应该发现我们上面那个demo中我添加了大量的一些装饰器,这些装饰器有什么作用呢?
使用方法 | 参数值 | 参数说明 |
@allure.epic() | epic描述 | 敏捷里面的概念,定义史诗,往下是feature |
@allure.feature() | 模块名称 | 功能点的描述,往下是story |
@allure.story() | 用户故事 | 用户故事,往下是title |
@allure.title(用例的标题) | 用例的标题 | 重命名html报告名称 |
@allure.testcase() | 测试用例的链接地址 | 对应功能测试用例系统里面的case |
@allure.issue() | 缺陷 | 对应缺陷管理系统里面的链接 |
@allure.description() | 用例描述 | 测试用例的描述 |
@allure.step() | 操作步骤 | 测试用例的步骤 |
@allure.severity() | 用例等级 | blocker,critical,normal,minor,trivial |
@allure.link() | 链接 | 定义一个链接,在测试报告展现 |
@allure.attachment() | 附件 | 报告添加附件 |
上面demo报告具展示结合上面表格一一对象说明
pytest运行测试用例的时候可以添加allure标记用例的参数
选择运行你要执行epic的用例
pytest —alluredir ./report/allure —allure-epics=一级别目录
选择运行你要执行features的用例
pytest —alluredir ./report/allure —allure-features=二级别目录
选择运行你要执行stories的用例
pytest —alluredir ./report/allure —allure-stories=”三级别目录”
——————————————
❺allure标记用例级别
——————————————
我们在做功能测试时,执行完一轮测试我们都会有测试报告的输出,那么就会统计缺陷的数量和等级。
那么在自动化测试过程中,测试用例越来越多的时候,如果执行一轮发现有不同的用例,我们同样希望尽快统计出缺陷的等级。
其实前面我们有用allure框架的等级划分属性。
等级划分:
- blocker 阻塞缺陷(功能未实现,无法下一步)
- critical 严重缺陷(功能点缺失)
- normal 一般缺陷(边界情况,格式错误)
- minor 次要缺陷(界面错误与ui需求不符)
- trivial 轻微缺陷(必须项无提示,或者提示不规范)
分析上面demo执行的结果图形模块,我们可以看到serverity部分,这表示的就是严重级别,具体如下图:
同样我们还可以使用allure命令行参数实现指定用例执行,
如果有很多测试用例,现在只想做个快速的回归测试,只测试用例级别为blocker和critical级别的测试用例
pytest —alluredir ./report/allure —allure-severities blocker,critical
也可以这样写
pytest —alluredir=./report/allure —allure-severities=blocker,critical
如果只执行blocker级别的用例
pytest —alluredir=./report/allure —allure-severities=blocker