详解用Pytest+Allure生成漂亮的HTML图形化测试报告


Posted in Python onMarch 31, 2020

对于软件测试工作来说,测试报告是非常重要的工作产出。一个漂亮、清晰、格式规范、内容完整的测试报告,既能最大化我们的测试工作产出,又能够减少开发人员和测试人员的沟通成本。

本篇文章将介绍如何使用开源的测试报告生成框架Allure生成规范、格式统一、美观的测试报告。
通过这篇文章的介绍,你将能够:

  • 将Allure与Pytest测试框架相结合;
  • 如何定制化测试报告内容
  • 执行测试之后,生成Allure格式的测试报告。
  • 如何与Jenkins集成。
  • 将测试环境信息展示到测试报告中。

1、Allure测试报告介绍

Allure是一款轻量级并且非常灵活的开源测试报告框架。 它支持绝大多数测试框架, 例如TestNG、Pytest、JUint等。它简单易用,易于集成。下面就Pytest如何与Allure集成做详细介绍。

2、Pytest框架集成Allure

Pytest是Python的单元测试框架,非常方便和易用。强烈推荐对于用Python进行测试工作的小伙伴使用这个测试框架,相比与Python自带的UnitTest好用太多太多。这篇文章我不会介绍太多Pytest测试框架的使用,今天主要是介绍如何将测试报告生成工具Allure集成到Pytest中。

2.1 安装Allure Pytest Plugin

allure-pytest是Pytest的一个插件,通过它我们可以生成Allure所需要的用于生成测试报告的数据。安装allure-pytest插件方法:

$ pip install allure-pytest

2.2 改造基于Pytest的测试用例

allure-pytest的官方文档中详细介绍了allure-pytest所具有的功能。本篇文章不会再翻译一遍,而是从实际入手,给大家介绍如何将其应用到自己的框架中。

为了使用Allure生成报告,需要在测试脚本中加入Allure特性。而这个操作并不会对原有的测试用例逻辑产生任何变动。

直接看下面的脚本,我通过在脚本中添加注释的方式给大家解释allure特性的用途。比如测试脚本是test_shopping_trolley.py:

#!/usr/bin/env python
# coding=utf-8

import pytest
import allure


@allure.feature('购物车功能') # 用feature说明产品需求,可以理解为JIRA中的Epic
class TestShoppingTrolley(object):
  @allure.story('加入购物车') # 用story说明用户场景,可以理解为JIRA中的Story
  def test_add_shopping_trolley(self):
    login('刘春明', '密码') # 步骤1,调用“step函数”
    with allure.step("浏览商品"): # 步骤2,step的参数将会打印到测试报告中
      allure.attach('笔记本', '商品1') # attach可以打印一些附加信息
      allure.attach('手机', '商品2')
    with allure.step("点击商品"): # 步骤3
      pass
    with allure.step("校验结果"): # 步骤4
      allure.attach('添加购物车成功', '期望结果')
      allure.attach('添加购物车失败', '实际结果')
      assert 'success' == 'failed'

  @allure.story('修改购物车')
  def test_edit_shopping_trolley(self):
    pass

  @pytest.mark.skipif(reason='本次不执行')
  @allure.story('删除购物车中商品')
  def test_delete_shopping_trolley(self):
    pass


@allure.step('用户登录') # 将函数作为一个步骤,调用此函数时,报告中输出这个步骤,我把这样的函数叫“step函数”
def login(user, pwd):
  print(user, pwd)

上面使用了Allure的几个特性:

  • @allure.feature # 用于描述被测试产品需求
  • @allure.story # 用于描述feature的用户场景,即测试需求
  • with allure.step # 用于描述测试步骤,将会输出到报告中
  • allure.attach # 用于向测试报告中输入一些附加的信息,通常是一些测试数据,截图等
  • @pytest.allure.step # 用于将一些通用的函数作为测试步骤输出到报告,调用此函数的地方会向报告中输出步骤

3、生成Allure测试报告

测试脚本中添加了Allure特性之后,可以通过两步,就可以展示出测试报告了。

第一步,生成测试报告数据

在py.test执行测试的时候,指定?alluredir选项及结果数据保存的目录:

$ py.test test/ --alluredir ./result/

./result/中保存了本次测试的结果数据。另外,还可以执行指定features或者stories执行一部分测试用例,比如执行”购物车功能“下的”加入购物车“子功能的测试用例:

$ py.test test/ --allure_features='购物车功能' --allure_stories='加入购物车'

第二步,生成测试报告页面

通过下面的命令将./result/目录下的测试数据生成测试报告页面:

$ allure generate ./result/ -o ./report/ --clean

?clean选项目的是先清空测试报告目录,再生成新的测试报告。

这一步需要提前安装allure命令行,如果是Mac电脑,推荐使用Homebrew安装。

$ brew install allure

4、解读测试报告

打开生成的测试报告后,浏览器被自动调起,展示测试报告。下面我们分别看看测试报告的几个页面。

4.1、首页

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

首页中展示了本次测试的测试用例数量,成功用例、失败用例、跳过用例的比例,测试环境,SUITES,FEATURES BY STORIES等基本信息,当与Jenkins做了持续置成后,TREND区域还将显示,历次测试的通过情况。
首页的左边栏,还从不同的维度展示测试报告的其他信息,大家可以自己点进去看看。

4.2、Behaviors页面

进入Behaviors页面,这个页面按照FEATURES和 STORIES展示测试用例的执行结果:

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

从这个页面可以看到“购物车功能”这个FEATURES包含的三个STORIES的测试用例执行情况。

4.3、Suites页面

Allure测试报告将每一个测试脚本,作为一个Suite。在首页点击Suites区域下面的任何一条Suite,都将进入Suites页面。

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

这个页面,以脚本的目录结构展示所有测试用例的执行情况。

4.4、Graphs页面

这个页面展示了本次测试结果的统计信息,比如测试用例执行结果状态、测试用例重要等级分布、测试用例执行时间分布等。

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

4.5、测试用例详情页面

在Suites页面上点击任何一条测试用例,Suites页面的右侧将展示这条用例的详细执行情况。

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

从这个页面可以看到测试用例执行的每一个步骤,以及每个步骤的执行结果,每一个步骤都可以添加附件,作为重要信息补充。从这里,对于失败的测试用例,可以一目了然看到原因。

5、Jenkins中生成Allure报告

5.1、安装 Allure Plugin

首先需要给Jenkins安装Allure Plugin。在Jenkins的插件管理页面,搜索“allure”,在搜索结果页,选择“Allure Jenkins Plugin”进行安装。

安装完成之后重启一下Jenkins。

在Jenkins的“全局工具管理”页面,找到Allure Commandline模块进行安装:

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

点击后,弹出下面的页面,输入Allure的命令别名和版本后,点击Apply 和Save。

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

5.2、修改Pipeline

在Pipeline的定义中,在执行测试用例的环节增加--alluredir ./allure-results保存测试结果数据,并在构建后的步骤中增加allure includeProperties: false, jdk: '', report: 'jenkins-allure-report', results: [[path: 'allure-results']]将测试结果数据生成测试报告页面,完整的Jenkinsfile如下:

pipeline {
  // ...
  stages {
  //...
    stage('执行测试用例') {
      steps {
        sh "py.test tests/ --alluredir ./allure-result"
      }
    }
  }
  post {
      always{
      script {
        allure includeProperties: false, jdk: '', report: 'jenkins-allure-report', results: [[path: 'allure-result']]
      }
    }
  }
}

这样,我们的Jenkins Job执行完测试用例时候,将在Job的主页面上看到Allure Report图标,点击进去就看到了Allure Report报告。

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

如果你现在依然使用的是Freestyle风格的job。那么需要在构建后步骤中,添加Allure Report步骤,将allure的报告数据添加到Path中:

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

这样当job执行完成后,也可以看到allure测试报告了。

6、增加测试环境到Allure报告中

在4.1小节展示的报告首页中,有一个区域可以展示测试执行的环境信息。但是目前allure-pytest插件中并没有实现。不过在之前我用过的另外一个插件pytest-allure-adaptor是支持的。可惜pytest-allure-adaptor插件项目已经被标记为Deprecated了。

将测试环境信息输出到报告中,对于测试报告来讲是非常有意义的。我们有没有什么变通的办法可以实现呢?在网上进行了一番查询,发现stackoverflow上也有很多关于这个话题的讨论。其中一个话题还给出了Workaround方法,这里给大家贴上链接:
https://stackoverflow.com/questions/52030518/recommend-workaround-for-the-missing-environmental-support-in-pytest-allure

这个Workaround的方法也比较简单方便,就是在allure-results目录中,新建environment.properties文件,并以key=value形式,在其中写入环境相关的信息,比如:

browser=chrome
backend=staging
domain=http://baidu.com

这样,在执行allure generate ./result/ -o ./report/ --clean生成测试报告时,将能将测试环境信息融合到测试报告的页面中了。

详解用Pytest+Allure生成漂亮的HTML图形化测试报告

这样看,测试报告是不是更显得完整了呢?

不过,这种手动方式还是比较麻烦,下面我们看看如何在pytest框架中,自动实现上面的workaround。

在Pytest中,有一个hook函数叫作pytest_sessionfinish,根据官方文档的描述,这个函数是在整个测试完成后被调用的,我们可以在其内部实现我们自己的逻辑。

我们将生成environment.properties文件放到pytest_sessionfinish中实现,再适合不过了。在测试项目的根目录下创建conftest.py文件,在其中实现pytest_sessionfinish函数,代码如下。

#!/usr/bin/env python
# coding=utf-8

def pytest_sessionfinish(session):
  with open("{}/result/environment.properties".format(session.config.rootdir), "w") as f:
    f.write("browser=chrome\nbackend=staging\ndomain=http://baidu.com")

这样,我们每次测试完成后,就自动将我们的测试环境信息添加到测试报告中了。

7、总结

团队内部可能不同项目使用的测试框架不一样,每个测试框架生成的测试报告也不一样。但由于Allure报告支持很多测试框架,通过Allure可以生成格式一致的测试报告,这就对外提供格式一致的测试报告提供了方便。

目前测试工程实践中,另外一个常用的自动化测试工具组合是采用的Java+TestNG的架构,TestNG框架如何集成Allure也非常简单。大家可以尝试参考官方文档来实现集成一下。

到此这篇关于详解用Pytest+Allure生成漂亮的HTML图形化测试报告的文章就介绍到这了,更多相关Pytest+Allure生成HTML图形化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用reportlab实现图片转换成pdf的方法
May 22 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
基于Python的关键字监控及告警
Jul 06 Python
python合并同类型excel表格的方法
Apr 01 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
Python生成并下载文件后端代码实例
Aug 31 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
python基础之while循环语句的使用
Apr 20 Python
浅谈Python基础之列表那些事儿
May 11 Python
利用Python实现模拟登录知乎
May 25 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 #Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 #Python
python实现udp聊天窗口
Mar 31 #Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 #Python
Python sorted排序方法如何实现
Mar 31 #Python
解决Django中checkbox复选框的传值问题
Mar 31 #Python
Python文本文件的合并操作方法代码实例
Mar 31 #Python
You might like
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
第七节 类的静态成员 [7]
2006/10/09 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
javascript继承之为什么要继承
2012/11/10 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python 操作MySQL详解及实例
2017/04/30 Python
python实现微信防撤回神器
2019/04/29 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
怎么样写好简历中的自我评价
2013/10/25 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
财产分割协议书
2016/03/22 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python