前言

其实这个方案,我在本论坛已经看到不少于 2 篇的实现文档,我为什么还要写这篇,其一,为了给自己一个总结,其二,在部署过程中遇到过一些坑,在这分享出来,也希望能给需要的人一个参考。方案很久之前都弄好了,只是才分享出来,也因为比较懒,写文档总是明日复明日。。。顺便吐槽一下,用 onenote 做笔记转成 markdown 发上来成本好高啊

为什么要用 Jmeter 做接口测试

当选择这套方案的时候,很多人会问,为什么选择 Jmeter 做 Case 管理?为什么不自己写框架?说实话,自己写框架有很大优势,比如易于拓展,易于定 制。Testhome 上也有很多很牛逼的框架,看着就让人流口水的。很多大公司都是自己写的框架,有 WEB 界面(我对界面有偏爱),有简洁的 Case 编写方式,有很好 用的录制方法…以至于我曾经也尝试写过一个(Java+Testng 执行 +Xml 管理 Case),但是过程很坎坷,遇到了很多坑(技术积累不足是很重要的一方面)。例如编写 Case 的时候调试很麻烦,后续拓展需要不断维护(不断封装新的参数获取方法)等等。所以,最终选择了它,大家可以自己尝试体会下。

Jmeter 做接口测试的优势

  1. Jmeter 支持录制,工具有 Gui 界面,入手相对简单。
  2. Gui 便于调试,本地调试通过上传,管理容易。
  3. 维护成本很小,Jmeter 功能比较全面,不会让自己陷入不停的维护框架的坑。
  4. Jmeter Case 是基于 xml 的(虽然后缀是 jmx 格式),执行结果也可以导出 xml 格式(结果为 jtl 后缀)

Jmeter 做接口测试的缺陷:

  1. 单条 Case 执行依赖本地
  2. Jmeter 编写 Case 有一定学习成本
  3. 拓展性稍差,Case 基于 xml 格式管理,后续如果想要自己编写平台,导出这些 Case 是个不小的工作量

Jmeter+Jenkins+Ant 实施方案的适用范围

  1. 小型公司或小团队,大公司有自己的平台,后续需求也多,还是自己写一套吧。
  2. 测试团队较小,没有专门的测试开发部门支持。
  3. 编程不是很牛逼的,如果你很厉害,自己能搞定所有前端,后台,自己搞比较好。
  4. 需要立刻出活的,不想将有限的精力放到后期维护当中的

Jmeter 相关插件安装:

插件安装:

Jmeter 的插件安装很简单,只需要下载对应插件解压即可。

用例生成与导出:

Jmeter 的用例格式为 jmx 文件,实际为 xml 格式,感兴趣可以学习下自己定制生成想要的 jmx 文件。

生成原则:

Jmeter 配置文件修改:

为什么要修改配置文件

去掉注释(#),修改 csv 为 xml
添加 jtl 文件结果参数:

根据想要保存的参数修改,若不会可参照后文第三方模板网址给出的参数修改。
修改后别忘记去掉注释(#)

Jenkins 相关插件介绍与配置:

Jenkins 插件安装方法本文不做介绍,感兴趣的可以查资料学习下。

Jmeter 插件:Performance plugin

 

 
 

Git 插件:

 
 

Ant 相关使用:

Ant 的具体使用方法本文不详细介绍,感兴趣可以自己阅读相关资料学习一下。

定制集成 Ant 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
 
<project name="ant-jmeter-test" default="run" basedir=".">
    <!-- 需要改成自己本地的 Jmeter 目录-->  
    <property name="jmeter.home" value="/home/apache-jmeter-2.13" />
    <!-- jmeter生成jtl格式的结果报告的路径--> 
    <property name="jmeter.result.jtl.dir" value="/root/.jenkins/jobs/ApiTest/workspace/report/jtl" />
    <!-- jmeter生成html格式的结果报告的路径-->
    <property name="jmeter.result.html.dir" value="/root/.jenkins/jobs/ApiTest/workspace/report/html" />
    <!-- 生成的报告的前缀-->  
    <property name="ReportName" value="TestReport" />
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/report.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/index.html" />        
<property name="lib.dir" value="${jmeter.home}/lib"/>
 
<path id="xslt.classpath">
        <fileset dir="${lib.dir}" includes="xalan*.jar"/>
        <fileset dir="${lib.dir}" includes="serializer*.jar"/>
    </path>
 
 
    <target name="run">
        <antcall target="test" />
        <antcall target="report" />
    </target>

    <target name="test">
        <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
        <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
             <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
            <testplans dir="/root/.jenkins/jobs/ApiTest/workspace/jmx" includes="*.jmx" />
 
<property name="jmeter.save.saveservice.output_format" value="xml"/>
 
        </jmeter>
    </target>
            
    <target name="report">
        <xslt classpathref="xslt.classpath"
  force="true"
  in="${jmeter.result.jtlName}"
              out="${jmeter.result.htmlName}"
              style="${jmeter.home}/extras/jmeter-results-lyz.xsl">
            <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 --> 
</xslt>
        <copy todir="${jmeter.result.html.dir}">
            <fileset dir="${jmeter.home}/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>
</project>

Case 管理目录结构:

关于 Case 的管理,因测试主要依赖 Jmeter+Ant 来做,结构如下:

  1. ./jmx/目录用来放 Jmeter 生成的 Case 文件(编写时注意,不要用绝对路径,否则后续维护成本会提高)
  2. ./res/目录用来放 Jmeter 测试需要的相关配置文件与资源,例如帐号信息,上传图片接口测试所需的图片等
  3. build.xml 文件,Ant 的配置文件
  4. 阅读 build.xml 文件,会发先还有一个自动生成的目录./report,该目录下有两个目录 jtl 以及 html,用来放置不同格式的测试报告。

测试执行与报告优化:

测试报告模板介绍:

 

 

关于拓展的思考:

Case 管理的优化拓展:

  1. 编写 Gui 工具导出与生成 Case,降低 Jmeter 学习成本。
  2. jmeter 的 case 其实 xml 格式,如果想要导出管理,可以编写工具导出存储以及编辑
  3. Jmeter3 支持直接生成 html 格式的 report,目前还没研究,有兴趣的可以学习一下


↙↙↙阅读原文可查看相关链接,并与作者交流