Jenkins+Jmeter+Ant 持续集成那些事......

达芬奇密码2018-08-09 13:11

前言

通过了解性能测试,知道了jmeter框架以及其扩展知识,jmeter不仅是性能测试利器而且还可以用于接口测试,经过近几周的学习,了解了jmeter的相关知识。但是在使用过程中还是遇到了问题,就是脚本较多时一一执行比较麻烦,我们不可能每次都一个一个的手动去点,这样不仅耗时还重复麻烦,那么有没有什么办法来批量运行Jmeter脚本呢?这个时候,我们就要想办法使其自动化。为了自动化想到了jenkins和ant,通过查看官方文档,发现ant有相应的JMeterTask。于是就准备一步一步的搭建基于Jenkins+Jmeter+Ant 的测试自动化框架,用于性能及接口自动化测试。其实这个方案,网上有许多的相关资料,某些资料写的也比较详细,在搭建该平台时也是参照了许多类似的文章,可能有人会说网上已经有许多相关的文章,你为什么还有写这篇呢?说实话这个问题问的非常好,其实搭建平台之初我内心也是没想要写文章的,因为发现网上相关的资料真的是太多了,根据网上的资料应该很容易搭建起来。但在实际操作中发现现实还是很骨感的,于是写下该文章其一为了自己总结,其二在搭建过程中遇到许多奇葩的坑,分享出来给有缘人参考。本文重点讲解自动化环境搭建的相关知识,至于如何基于jmeter进行性能和接口测试会后续给出。欲知详情,敬请等待....

一、自动化测试环境搭建准备

    1. 下载jdk1.6以上及环境配置 
    2.下载 ant及环境配置 
    3. 下载jmeter
    4. 下载jenkins
上述工具的下载及环境配置可自行百度,由于篇幅原因本文不做介绍。

二、自动化测试环境适用场景

   1.日常迭代接口测试的自动化。
   2.项目性能测试的自动化。

三、Jenkins持续集成配置说明

      环境准备工作完成后,需要在Jenkins进行相关的配置来实现自动化。Jenkins新建job及插件安装方法本文不做介绍,感兴趣的可以自行百度搜索。本文重点讲解jenkins中的ant、Performance plugin、HTML Publisher plugin和 Email Extension Plugin等插件的配置,用于产品性能及接口测试、生成测试报告及邮件通知功能,最终实现自动化的目的。

3.1 Ant插件:Ant Plugin

   功能:用来执行Ant
   配置截图:

    - 配置说明:
    - Ant Plugin可以在构建步骤中添加,直接执行构建。
    - targets:执行目标.
    - build file:指定执行build.xml路径.
ant插件安装成功后,在配置项中指定build.xml的路径,利用jenkins自动构建时会根据路径找到build文件,执行文件的配置内容。因此为了能够实现自动化,需要定制build.xml。下面给出我的build文件作为参考,可以通过替换路径作为己用。

3.2 Jmeter插件:Performance  plugin

   功能:展示jmeter执行结果
   配置截图:

配置说明:
Report files:配置jtl文件路径,相对路径与绝对路径均可,图为相对路径
其他选项:配置失败比例显示图形等参数,按需配置。

3.3 Jmeter插件:HTML publisher plugin

  功能:用来展示jmeter执行结果
  配置截图:

配置说明:
 - HTML directory to archive:填写生成html文件的路径
 - index page[s]:填写展示报告的主页
 原理说明: 本插件并不会自己产生html文件,而是通过xslt转化xml生成的报告, xslt可以自己在服务器中安装,也可以通过通过Ant配置文件指定xslt路径,本文就是通过Ant配置文件指定xslt路径(先下载xslt文件)的方式生成html文件。
因为jenkins安全性的问题,默认加载出来的报告是无css的,通过以下配置解决:
HTML Publisher Plugin 插件在新的Jenkins版本中会导致打开的网页中无法加载CSS以及无法点击按钮的情况,由于CSP导致,可在Jenkins控制台中执行:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
以解决此问题。其他由于CSP原因导致的html插件也可用此方法解决

3.4 jenkins邮件插件配置

但是实际操作中发现如果接口较多时,jenkins构建需要一定的时间,为了看到最终的执行结果,我们只有一直等待或是过一段时间回来确定。但这样都不好。如何可以让构建结果通知相关人员?于是想到利用jenkin自带的邮件插件,实现实时将构建结果通知给相关人员。

3.4.1. 系统管理设置

Jenkins系统管理->系统设置

如图,使用一个已有的邮箱(比如163或者qq)作为邮件通知邮箱,配置SMTP服务器,邮箱的用户名和密码。切记需要开通邮箱的SMTP服务,此处踩了坑...下面会详细介绍。
3.4.2 配置完成后可以勾选“通过发送测试邮件测试配置”进行测试是否配置成功,如下图则说明搭建成功。


3.4.3.Job配置

在需要邮件通知的Job设置里面增加“构建后操作步骤”->选择E-mail Notification

邮件通知配置可以选择在每一次构建成功或 不成功,需要群发邮件的收件人信息。


但是如果你群发的收件人列表比较多,或者每次通知的人不一样,比如每次只想通知导致构建失败的那个人(即最后一次上传代码的人),

那么简单的E-mail Notification肯定不能满足你的要求,需要加入下面这个插件Email extension plugin。

如果希望分别针对构建成功和构建失败发送不同的邮件通知,可以点击Advanced Setting。
注意Triggers的设置,可以配置多种Triggers(触发器),Failure-Any,Failure-1st(第一次构建失败),Success,Fixed,Abort等等。
触发器的种类很多,可以根据实际需要选择。每种触发器可以根据需要选择Send To,比如Failure-Any可以add upstream Committers,Requestor等等。
每一个Trigger可以单独在高级中配置Default Subject,Default Content,Recipient List等等,所以在触发器中的这个设置是可以覆盖上面的基础设置的。

因为在Jenkins系统管理->系统设置中可以设置收件人,但是如果想进行修改,必须要由Job页面返回到系统设置页面,操作比较麻烦而且不灵活。为了灵活操作,我是通过创建参数来设置需要发送的邮件列表,然后在Project Recipient List中通过参数进行读取,可以灵活设置。效果如下图:

这样如果需要修改收件人列表,只需要用逗号将用户邮箱分割就好,设置后构建结果就可以自动发到相关人员的邮箱,实现测试自动化。


四、测试执行与报告优化原理

jmeter执行的结果文件默认有许多执行数据是不保存的,但这样生成的测试报告过于简单,不能满足我们的需求。因此为了得到html格式的报告且满足我们对测试报告的需求,需要对jmeter的配置文件进行修改,订制测试报告的显示形式。jmeter自带模板,模板路径为${jmeterhome}/extras/jmeter-results*.xsl,该模板中相应的值是通过jmeter.profile配置文件来配置的。因此我们只需修改${jmeterhome}/bin/jmeter.profile配置文件,设置所需的报告参数就可以了。

4.1 测试报告格式设置原理

 jmeter执行的结果文件不是xml格式的,因此无法转换为html格式的报告。只能将其执行结果的文件格式变为xml,才能通过xslt转换为html。所以去掉下图注释(#),修改csv为xml。

4.2 测试报告数据个性化设置原理

 jmeter生成的报告默认只显示值为ture的字段,信息量较少。为了定制测试报告,可以根据想要保存的参数进行修改,修改后千万别忘记去掉注释(#),不然是不会生效的。


4.3 xstl源码分析:jtl格式转换为html原理


通过上面介绍,我们知道为了得到html格式的测试报告,需要将jmeter产生的xml文件通过xslt工具转换为html,但具体是怎么转换呢?可能大家并不太清楚,下面通过分析xslt和jtl的源码,详细介绍:

4.3.1 jmeter默认生成测试报告jtl文件代码:

我们将其与jemter.properties文件进行对比分析,可以看出jtl文件中生成的测试数据与jemter.properties文件的值一一对应。这也就直接说明了为什么修改jemter.properties文件可以定制测试报告了。

4.3.2 xslt文件源码

可以看出xslt通过读取jtl中的值填充到html页面中,生成html报告。因此定制测试报告的原理我们应该也清楚了,我们可以读取我们需要的值显示在我们的报告中,实现报告的定制化。

   再次总结强调下测试报告优化原理:通过修改jemter.properties将我们希望生成的值设置为true,这样在生成的jtl文件中就会产生对应的数据。而html报告最终呈现的结果实际是xstl中通过获取jtl的数值,因此为了设置简单,我们可以将jemter.properties文件中的数据字段全部设置为true,然后通过配置xstl来的定制测试报告。xslt 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。通过 XSLT,我们可以向或者从输出文件添加或移除元素和属性。也可重新排列元素,执行测试并决定隐藏或显示哪个元素等等。而且xslt和html较像,容易进行二次开发。
经过上面的配置,可以得到HTML和Performance 报告
HTML报告

Performance 报告:


至此,环境搭建已经基本完成,可以进行简单的性能及接口测试,且可以生成定制化的测试报告,满足了我最初的目的了。
至此一套自动化测试框架算是完整搭建成功了,虽然网上的资料较多,但是毕竟不满足个人需求,需要将其整合或变更以便满足自己的需求,過程中还是踩过许多坑,遇到很多坎,本文一一记录并提供解决办法及分析原因。

五、搭建过程中的坑及对应解决办法

5.1.ant,jdk下载且正确安装,环境变量也配置正确,执行jenkins,满怀希冀的希望可以构建成功,但现实是残酷的,构建失败,日志如下:
可以看出ant.bat不能识别,出现这个问题有可能是环境变量配置错误,于是第一反应就是重新查看环境的配置,发现没有问题呀。坚持不懈一次次运行,情理之中仍是失败,错误日志也一样。命令行执行ant -version提示正确,再次证明ant配置正确,但为什么提示失败呢,不识别该命令呢?该框架需要ant、jdk和jenkins,初步怀疑可能jdk和ant版本冲突,于是问了下度娘,发现jdk和ant之间确实有版本要求,但是百度上没搜到具体的信息,于是试着去ant官网上有没有说明,功夫不负有心人最终找到了:

可以看出ant1.9.x需要java5以上的版本,ant1.10.x需要java8。而我用的jdk7,ant用的是最新的1.10.1,所以原因不言而喻。解决办法大家应该也知道了,我的选择是保持jdk不变,用了1.9.x版本的ant。

5.2.查看错误日志时,提示build.xml:6: Unexpected text " "

但查看build.xml文件第6行没有发现这个符号,只是第6行有行注释。试着将其删除,再次重新构建,错误定位到下个注释的行,解决办法就是将所有的注释删除,问题解决。至于为什么有注释会报错,原因仍在定位,值得思考....

5.3. 问题:taskdef class org.programmerplanet.ant.taskdefs.jmeter.JMeterTask cannot be found

这个报错非常坑爹,是由于Ant的lib文件没有ant-jmeter-1.1.1.jar这个jar包,因为ant执行jmeter脚本时会调用JMeterTask,但是在ant的lib文件没有相应的jar包。所以一直会报这个错。解决:把jar包:ant-jmeter-1.0.9.jar放到ant的lib路径中即可。因为JMETER的测试结果一般生成的是一份聚合报告,如果想用ANT生成具体的测试报告,需要这样的一个jar包 ant-jmeter-1.0.9.jar 里面提供的一个JMeterTask的类来运行JMTER的测试脚本,生成jtl的结果文件,然后用XSLT来把.jtl的结果文件转化为.html形式的结果报告。



5.4.测试报告中没有数据

这个问题就是由于.xsl文件不正确导致的,解决办法在网上找个靠谱的.xsl文件,或是理解.xsl文件原理自己编写。

说明了jenkins的性能测试报告不是直接读取jtl文件中的数据,仍需要通过.xsl文件转换。

5.邮件发送失败
查看日志可知,连接不到SMTP服务器,上网查了些资料没有找到直接说明的文章,其中有一篇文章说明要首先邮箱开通SMTP服务,然后尝试一下,发现可以解决问题,原因是需要在相应的邮箱开通SMTP服务,才可以发送邮件。详细可以参照该 文章 http://jingyan.baidu.com/article/0f5fb099dffe7c6d8334ea31.html。开通邮箱的SMTP服务后会产生密码,将收到的SMTP服务密码填充到系统管理设置邮件中对应的输入框中,可以解决该问题

网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者付二帅授权发布。