jenkins+ANT+jmeter 接口测试环境搭建

目的

jmeter很早就接触了,最近又在接触项目的时候整了一下。写这篇博客主要有两个目的

1,为了给自己搭建jmeter做一个总结。

2,在部署过程中遇到过一些坑,在这分享出来,也希望能给需要的人一个参考。

接口测试概述

详细介绍jmeter接口测试环境之前,先简单介绍下接口测试

API testing is a type of software testing that involves testing application programming interfaces (APIs) directly and as part of integration testing to determine if they meet expectations for functionality, reliability, performance, and security. Since APIs lack a GUI, API testing is performed at the message layer.[2] API testing is now considered critical for automating testing because APIs now serve as the primary interface to application logic and because GUI tests are difficult to maintain with the short release cycles and frequent changes commonly used with Agile software development and DevOps).

WIKI定义:接口测试作为集成测试的一部分,通过直接控制API来判断系统的功能性,可靠性,性能与安全性。API测试是没有界面的,执行在通讯层。API 测试在自动化测试中有着重要的地位,因为API一般是应用逻辑的主要接口,而GUI测试在敏捷开发和DevOps的快速迭代和频繁变更中很难维护。

分类

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
  接口测试适用于为其他系统提供服务的底层框架系统和中心服务系统,主要测试这些系统对外部提供的接口,验证其正确性和稳定性。接口测试同样适用于一个上层系统中的服务层接口,越往上层,其测试的难度越大。
  接口测试实施在多系统多平台的构架下,有着极为高效的成本收益比,接口测试天生为高复杂性的平台带来高效的缺陷监测和质量监督能力。平台越复杂,系统越庞大,接口测试的效果越明显。
  基于接口测试的重要性,以及它比较容易自动化的特性,通过持续集成的接口监控能够及时的发现项目中存在的问题,这对持续运营的项目来说,非常重要。

模块接口测试

模块接口测试是单元测试的基础。它主要测试模块的调用与返回。经常需要编写一些桩模块与驱动模块。
主要测试要点如下:

检查接口返回的数据是否与预期结果一致。
检查接口的容错性,假如传递数据的类型错误时是否可以处理。
接口参数的边界值。例如,传递的参数足够大或为负数时,接口是否可以正常处理。
接口的性能,接口处理数据的时间也是测试的一个方法。牵扯到内部就是算法与代码的优化。
接口的安全性

WEB接口测试

web接口测试又可分为两类:服务器接口测试和外部接口测试。

服务器接口测试:是测试浏览器与服务器的接口。用户输入的数据是输入到的前端页面上,怎样把这些数据传递的后台的呢?通过http协议的get与post请求来实现前后端的数据传递。这也可认为是接口测试。
外部接口测试:这个很典型的例子就是第三方支付,比如在我们应用中在充流量时,交话费时,都会调用第三方支付接口。

主要测试要点如下:

请求是否正确,默认请求成功是200,如果请求错误也能返回404、500等。
检查返回数据的正确性与格式;json是一种非常常见的格式。
接口的安全性,一般web都不会暴露在网上任意被调用,需要做一些限制,比如鉴权或认证。
接口的性能,这直接影响用户的使用体验。

接口测试工具

SOAPUI
JMeter
Grinder
Suds Python

接口测试的流程

1、 项目启动后,测试人员要尽早找到开发人员拿到接口测试文档
  2、 获取接口测试文档后,就可以进行接口用例的编写和调试
  3、 接口用例编写调试完成后,部署到持续集成的测试环境中,
  4、 设定脚本运行频率,告警方式等基本参数,进行接口的日常监控
  5、 每日进行接口脚本的维护更新,接口异常的处理

测试用例设计与原则

测试用例

正面测试用例:

  • 覆盖所有的必选参数

  • 组合可选参数

  • 参数边界值

  • 如果参数的取值范围是枚举变量,需要覆盖所有枚举值

  • 还应考虑实际业务应用场景,去设计输入参数的组合。(这些用例可用来测试功能,作为SMOKE用例。也可将来用于压力测试模拟实际业务场景,但要注意保证用例的独立性,因为压力测试是多线程的。比如我们测试ACCOUNT 创建接口,NAME是不能重的,在写测试用例时,给NAME赋值时可以加一个时间戳, 这样用例在多线程并发测试时也不会有问题)

负面测试用例:

  • 空数据

  • 包含特殊的字符

  • 越界的数据

  • 错误的数据

验证点:

  • status code (正常情况下,所有请求都应该返回200)

  • 响应信息数据结构(目前大多数情况下,返回信息都是JSON, 我们应该验证相应的结构当数据信息发生改变时)

  • 验证结点的类型

  • 验证结点的值 (主要是针对固定的值或者值遵循某些规则,我们能知道预期的结果的)

  • 对于列表,应该根据请求参数,也应该验证列表的长度是否与期望值一致

  • 负面测试用例,应验证ERROR INFO是否与实际相匹配

测试原则

测试应该是独立的、可读的、抗变的、可维护的,其实这也是所有自动测试应该遵循的原则

  • 每个测试用例都是独立的

  • 测试用例都是可重复运行的 (这主要是说一些测试数据不能写死,不同的环境数据可能不同。在实际工作中,解决方案有二:自已创建所需要的数据,比如你要测试接口需要输入参数ACCOUNTID,你可以先调用创建ACCOUNT API, 然后从响应值拿到ACCOUNTID, 当你测试完你要测的接口后,再把新建的ACCOUNT删除,也就是说一个测试用例分了三步。另外一种方法就是读取数据库,从数据库获取数据,这种方法在测试开发与测试环境还OK,但如果测线上环境就比较困难了,因为我们不能随意更新上面的数据,也不能放过多的测试数据在上面。因此我个人比较推崇第一种方法,虽然增加开发用例的工作量,但一劳永逸)

  • 测试能被运行在不同的环境里(平常测试环境至少会分DEV/TEST/STAGING/ONLINE,我们在测试过程中,应该把域名,token/apikey等应放在一个变量里,当切换环境时,我们只需改变变量的值即可

  • 测试数据与业务相分离(测试数据包括参数接口数据/ 测试执行所需要的系统数据)

  • 尽量统一共用的测试环境变量

  • 测试完成后,要删除不必要的测试数据。

为什么要用Jmeter做接口测试

很大的一个原因是考虑了在部门内进行推广的成本问题,另外也有开发能力较弱,时间有限不能充分去研究。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的插件安装很简单,只需要下载对应插件解压即可。

用例生成

生成原则:

  • 每个功能模块为一个独立的jmx文件。增加可维护性。(尽量不要将一个jmx文件放入太多功能,后期维护成本会很高。)
  • 模块的私有变量保存在模块中,多模块共有的(例如服务器ip端口等)可以考虑存在单独的文件中读取。
  • 接口测试不要放太多线程,毕竟不是做压力测试,意义也不大。
  • 导出方法:
  • 编写测试用例
  • 文件——保存为——指定路径——确定:

Jmeter配置文件修改:

为什么要修改配置文件

  • jmeter执行结果文件默认保存的不是xml格式,无法转化成html格式
  • jmeter执行结果文件默认有很多执行数据是不保存的,而测试报告需要这些数据
  • 配置文件路径 ${jmeterhome}/bin/jmeter.profile
  • 配置文件修改内容: 修改jtl文件格式
    • 2.7默认实际已是xml,但是在2.7之前的版本还是csv

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

根据想要保存的参数修改,若不会可参照后文第三方模板网址给出的参数修改。(后面会提到修改jmeter自带的报告模板,部分数据需要在这里配置进行展示
修改后别忘记去掉注释(#)

Jenkins相关插件介绍与配置:

Jenkins插件安装方法本文不做介绍,感兴趣的可以看我jenkins相关的博客。

Jmeter插件:Performance plugin

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

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

Ant插件:Ant Plugin

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

  • 配置说明:
  • Ant Plugin可以在构建步骤中添加,直接执行构建。
  • targets:执行执行目标
  • build files:指定执行build.xml路径

除了Ant插件执行,也可以选择命令行执行:

  • 添加shenll脚本(windows下添加dos脚本)执行构建
  • 相比用插件构建,命令行构建有以下优缺点:
    1. 需要在服务器中直接安装ant并配置环境变量,确保jenkins可以直接执行ant命令
    2. 如果Jenkins是放在tomcat容器中,需要在tomcat中配置环境变量,否则会报找不到Ant命令,具体配置如下:
    3. 编辑catalina.sh文件,加入环境变量,否则jenkins会报找不到Ant错误()
      #See the license for the……
      JAVA_HOME=/usr/lib/jvm/jdk1.8.0_31
      Export JENKINS_HOME="/root/.jenkins"
    4. 灵活性更强,可以直接指定Ant的执行参数

 Svn插件:Subversion Plug-in

  • 功能:版本管理,按需使用
  • 配置截图:

  • 配置说明:
  • Reponsitory URL:填写仓库url地址
  • Add按钮:添加svn的用户名密码
  • 其他选项:按需配置

  Html展示插件:HTML Publisher plugin

  • 配置说明:
  • HTML directory to archive:填写生成html文件的路径
  • index page[s]:填写展示报告的主页
  • 其他选项:按需填写
  • 原理说明:
  • 本插件并不会自己产生html文件,而是通过xslt转化xml生成的报告
  • xslt可以自己在服务器中安装,也可以通过通过Ant配置文件指定jar包,本文就是通过Ant指定jmeter内部集成的jar包生成的html文件并不是在jenkins中默认的报告路径展示,而是会复制到${jenkinshome}/jobs/projectname/htmlreports/HTML_REPORT目录下

  每次只能展示最新版本的html报告,也就是说上一次编译的html报告会被覆盖,因为jenkins安全性的问题,默认加载出来的报告是无css的,通过以下配置解决:

  HTML Publisher Plugin 插件在新的Jenkins版本中会导致打开的网页中无法加载CSS以及无法点击按钮的情况,由于CSP导致,可在Jenkins控制台中执行:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
  以解决此问题。其他由于CSP原因导致的html插件也可用此方法解决

Jenkins项目总体配置:

  • 服务器环境与依赖
  • Jdk:安装并配置环境变量
  • Ant:安装并配置环境变量
  • Jmeter:安装并添加需要的插件
  • 其他:
  • Jmeter+Ant,需要将${jmeterhome}/extras/ant-jmeter-1.1.1.jar文件拷贝到${anthome}/lib目录下,否则编译会报错
  • Jmeter如需链接数据库,需添加jdbc插件
  • 如果不引入jmeter中的xslt,需要手动安装该软件
  • Jenkins项目配置:
  • jenkins的工作路径,同样的jar包都可能会生成不同的路径。 jenkins——系统设置——高级

Ant相关使用:

定制集成Ant配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<project name="ant-jmeter-test" default="all" basedir=".">
    <tstamp>
        <format property="time" pattern="yyyyMMddhhmm" />
    </tstamp>
    <!-- 需要改成自己本地的 Jmeter 目录-->
    <property name="jmeter.home" value="D:Devlopjmeterapache-jmeter-2.7" />
    <!-- jmeter生成jtl格式的结果报告的路径-->
    <property name="jmeter.result.jtl.dir" value="D:APIJF_APIReportjtl" />
    <!-- jmeter生成html格式的结果报告的路径-->
    <property name="jmeter.result.html.dir" value="D:APIJF_APIReporthtml" />
    <!-- 生成的报告的前缀 -->
    <property name="ReportName" value="TestReport" />
	<!-- 需要输出html报告的时候,html附带时间
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />
	-->
	<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />
	<!-- Diffrent version of Jmeter has its own ant-jmeter.jar,Please input the right versioin -->
	<path id="ant.jmeter.classpath">
	<pathelement location="${jmeter-home}/extras/ant-jmeter-1.1.1.jar" />
	</path>
	<!-- use this config to generate html report; if not, may not display Min/Max Time in html-->
	<path id="xslt.classpath">
	<fileset dir="${jmeter.home}/lib" includes="xalan-2.7.1.jar"/>
	<fileset dir="${jmeter.home}/lib" includes="serializer-2.7.1.jar"/>
	</path>
	
    <target name="all">
        <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="D:APIJF_APITest_Play" includes="*.jmx" />
			<property name="jmeter.save.saveservice.output_format" value="xml"/>			
        </jmeter>
    </target>

    <target name="report">
        <xslt in="${jmeter.result.jtlName}"
              out="${jmeter.result.htmlName}" classpathref="xslt.classpath"  
              style="${jmeter.home}/extras/jmeter-results-detail-report_30.xsl.xml" />
		<xslt in="${jmeter.result.jtlName}"
              out="${jmeter.result.html.dir}TestLog.html" classpathref="xslt.classpath"  
              style="${jmeter.home}/extras/jmeter-results-shanhe-me.xsl" />

        <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
        <copy todir="${jmeter.result.html.dir}">
            <fileset dir="${jmeter.home}/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>
</project>
  • 如上,有文字标示的地方需要修改,对应的路径需要修改为自己的本地路径
  • style参数为生成html文件的模板文件,可以修改为自己的模板文件,jmeter提供了多个模板文件可供使用,我这里调用了两个style文件

Case管理目录结构:

  1. ./Test_Play/目录用来放Jmeter生成的Case文件(编写时注意,不要用绝对路径,否则后续维护成本会提高)
  2. ./Test_suit/目录用来放Jmeter测试需要的相关配置文件
  3. ./资源/目录用来存放项目相关的一些文档信息
  4. build.xml文件,Ant的配置文件
  5. 阅读build.xml文件,会发先还有一个自动生成的目录./report,该目录下有两个目录jtl以及html,用来放置不同格式的测试报告。

测试执行与报告优化:

  • jmeter自带模板
  • jmeter自带了4个模板
  • 模板路径:${jmeterhome}/extras/jmeter-results*.xsl
  • 模板效果(jmeter-results-detail-report_30.xsl.xml):

- 模板使用:

- 修改${jmeterhome}/bin/jmeter.profile配置文件,添加所需的报告参数
- build.xml文件中指定,(演示效果指定了两个模板 1.jmeter-results-detail-report_30.xsl.xml   2.jmeter-results-shanhe-me.xsl  两个模板都可在网上进行下载)

- 下载地址:http://shanhe.me/node/18/314

注意事项:
- 千万不要忘记修改jmeter.profile文件
- 地址中介绍build.xml文件以及jmeter.profile文件具体的参数修改,不要忽视

指定从第一个跳转到第二个Log网页也很简单,jenkins要用的时候把两份都上传了就好

 
 
注:文中许多内容参考了网上许多资料,非常感谢各位的知识分享!
原文地址:https://www.cnblogs.com/YatHo/p/6061225.html