详解用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之入门(四)运算
May 27 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
如何定义TensorFlow输入节点
Jan 23 Python
python GUI模拟实现计算器
Jun 22 Python
Django项目创建及管理实现流程详解
Oct 13 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 Python
Python实现区域填充的示例代码
Feb 03 Python
python如何为list实现find方法
May 30 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
PHP 变量的定义方法
2010/01/26 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
Python中unittest用法实例
2014/09/25 Python
Python实现的爬虫功能代码
2017/06/24 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
详解Python 最短匹配模式
2020/07/29 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
啤酒销售实习自我鉴定
2013/09/24 职场文书
料理师求职信
2014/01/30 职场文书
春节晚会主持词
2014/03/24 职场文书
小学生优秀评语
2014/12/29 职场文书
队名及霸气口号大全
2015/12/25 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
JavaScript分页组件使用方法详解
2021/07/26 Javascript
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫