1. 前言

Jenkins+Ant+Jmeter这一套自动化性能测试框架,最近有不少测试的朋友问,这篇文章是由我们原测试团队共同编写的,由于我们后期采购了第三方的自动化测试平台,此套框架已经不在使用了,经原团队许可,分享给大家,给大家做一点参考,也感谢原团队各位老师和同学的支持。

2. 摘要

无论是互联网还是金融行业的产品都必须依赖大量的后台接口提供的服务,后台接口稳定与性能对系统的易用性起着至关重要的作用。传统的接口手工测试做起来繁琐且有大量重复工作,自动化框架的开发与维护成本较高。对此,本文介绍了一种轻量级的基于jenkins持续集成的接口自动化测试实现方法,介绍了该自动化框架的策略与实现方案,以及在券商行业项目中的应用实例。

3. 接口测试框架

接口测试主要用于检测外部系统与系统之间以及各子系统之间的交互点,测试的重点在数据的交互、传输是否正确,以及系统间的相互逻辑依赖关系等。简单说就是给系统发送想传输的数据,验证系统是否按我们的需求返回结果。

在自动化测试的展开中,会不断对框架提出新的要求,需要有持续的测试开发人力投入,保证框架的高质量和稳定性。我们总结了一些常用的接口测试框架,如下:

通过对比,我们决定选用轻量级的开源工具JMeter,来快速构建一套可用的接口测试框架。测试用例采用了JMeter支持的CSV方式进行积累,利用JMeter可以很方便的读取csv测试用例,快速的积累接口测试用例。

4. 接口自动化测试框架介绍

接口测试框架的选型,工具类或语言类,考虑因素不仅是个人负责这一块接口自动化的框架搭建和脚本编写,用例设计及执行,还需要测试团队乃至研发团队都能使用;因此尽可能选用灵活设计的工具类框架,适合大众,方便大家共同维护和交流;JMeter在做接口自动化测试方面,网络提供了很多解决方案,除此外JMeter为开源项目也支持二次开发,基本满足测试需求。

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化的构建来验证,从而尽快的发现集成错误。

Apache Ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。Ant运行时需要一个XML文件, Ant通过调用target树,就可以执行各种task。

由于我们是需求和测试计划一一相对应,即一个需求一个JMeter脚本文件,这就意味着多个需求就会有多个JMeter脚本文件(*.jmx),如果我们不适用ANT工具,那么每个脚本文件都会产生自己的测试报告,不方便我们了解整体的测试情况。为了方便了解完整的测试情况,输出整体测试报告,我们通过配置ANT来完成JMeter的脚本执行并将测试结果进行收集聚合,生成一份完整的测试报告。

由于当时团队是采用持续集成jenkins进行代码的发布与运行,为实现持续集成、批量运行、定时报告输出。因此我们使用了SVN+JMeter+ANT+Jenkins框架来实现接口自动化。Jenkins控制机先从SVN服务器上获取JMeter脚本和测试数据,将脚本和数据拉取到Slave执行机上,并向执行机发送指令,调用ANT执行案例,ANT执行完案例,将.jtl报告聚合成一个*.html报告,由于ANT聚合的报告没有满足我们的个性化的需求,所以我们通过Python脚本对ANT生成的*.html报告,进行了二次解析,解析完成后,我们调用邮件发送模块,将测试报告发送给相关人,整体流程如下图所示:

5. 框架特点与实现方法

在接口测试案例设计时,我们将需求与JMeter相映射,即需求对应到JMeter下的测试计划(TestPlan),需求下的相关接口对应到测试计划下的线程组(Thread Group),线程组下的采样器(Sampler)对应到具体的案例。映射结构如下图所示:

用例设计与脚本分离:在案例设计之初,为了考虑到脚本的可维护性以及接口测试的特点,我们将测试数据和测试脚本分离,使用CSV管理数据测试用例,如果涉及一些配置文件或者其它参数,也可以通过txt来保存,或者使用工具本身的参数化元件来完善脚本,通过这种形式尽可能的降低需求变动对案例的影响,降低项目的维护成本。

测试数据和脚本分离的另一大优势就是可以大大降低JMeter脚本中采样器的数量,一个接口的采样器的数量只需要一个或几个即可。由于接口测试的测试点主要是针对参数进行校验,我们将采样器的参数全部进行参数化,通过CSV数据配置元件读取CSV文件,将CSV文件中测试数据在采样器中不断的循环迭代,即可完成所有案例的测试,如下图所示:

测试数据参数化

多采样器控制:众所周知,接口的测试场景是多样的,很多时候,一个采样器是无法满足测试需求的,比如:在一个定投的接口中,有一个logintoken的字段,用于记录用户的登录信息,这个logintoken是有时效的,同时也是动态生成的,这种情况下,我们如果想去测试logintoken正常、为空、非法的情况,显然一个采样器是无法满足需求的,此时需要多个采样器,我们通过人为的在测试数据文件(*.csv)中,添加一个标记字段,如:添加一个flag的字段,当flag为0的时候,logintoken传入动态生成的值,当flag为1的时候传入CSV文件中的定值,然后我们在JMeter脚本中添加逻辑控制,通过标识来告诉案例,应该在那个采样器中执行,如下图所示,通过这种方式可以满足多样的接口测试场景。

定制化开发函数: 在JMeter的函数助手中,已经有众多的函数支持接口案例编写,但是我们某些特定的场景,JMeter自带函数不能很好的满足我们的需求,需要我们定制开发函数,比如券商的银证转账业务,该业务只有在指定时间段,才能转账成功,非交易时间就会提示”此时间段不能进行银证转账”,也就意味着不同时间段执行银证转账的案例,其返回结果是不同的,为了案例能够在任何时间段都可以正确的执行,我们需要通过判断当前时间是否为交易时间来进行分别断言,此时我们就需要开发一个判断当前时间是否可以进行银证转账的函数,并将其封装成jar包并导入JMeter中,进行调用,在JMeter中我们通过使用自己定制函数来进行复杂的业务处理,以满足不同场景下的业务需求,由测试开发人员对复杂的业务逻辑进行封装,如下图所示,测试人员只需在JMeter的BeanShell元件中调用即可。

批量自动运行与定制报告:ANT生成的测试报告,是以请求为单位进行统计的,即一个请求一条统计记录,不能很好反应一个接口或一个需求下的案例执行情况,所以我们进行了二次开发,对ANT生成的测试报告通过Python进行二次解析,从整体测试情况、单需求测试情况、单接口测试情况三个维度进行统计,并生成测试报告,二次解析后的报告,能够更加直观、清晰的了解项目的整体测试情况,二次解析报告如下图:

6. 接口测试案例演示

数据与脚本分离:我们在撰写一个接口的用例时,在CSV中将入参和出参设计完整,待接口实现后,配置好接口请求即可自动运行。测试数据的撰写可以待接口文档出来后与开发同步进行,在提测后可以第一时间发现接口的bug,减少后期发现bug的修改回归成本。如下所示,脚本与数据分离,数据驱动脚本运行。

模块的自动化用例完整结构:如下为三方存管设置的自动化用例,我们http请求默认值,登录获取token作为共用变量,在其他模块启动前,先调用获取共用token。将一个接口里的公用参数通过变量引用作为参数作为入参,将断言的出参校验也作为变量传递。

自动化的运行:配置ANT的build.xml文件,ANT 解析build.xml文件后,运行.jmx脚本,执行脚本生成.jtl文件(.jtl文件为JMeter结果文件),ant 利用指定的.xsl文件(报告模板文件)去解析.jtl文件,生成最终的html报告文件,配置文件示例如下:

<?xml version="1.0" encoding="UTF-8"?><project name="ant-jmeter-test" default="run" basedir="."><tstamp><format property="time" pattern="yyyyMMddhhmm" /></tstamp><!-- 本地的jmeter目录--><property name="script_path" value="E:\Project\jinkens\workspace\Auto_Interface_APP_接口测试" /><!-- 本地的jmeter目录--><property name="jmeter.home" value="E:\Project\tools\apache-jmeter-5.0\" /><!-- jmeter生成的jtl格式的结果报告的路径--><property name="jmeter.result.jtl.dir" value="E:\Project\jinkensTest\jtl" /><!-- jmeter生成的html格式的结果报告的路径--><property name="jmeter.result.html.dir" value="E:\Project\jinkensTest\report" /><!-- ?生成的报告的前缀--><property name="ReportName" value="APP接口测试报告附件" /><property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" /><property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" /><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="${script_path}" includes="*.jmx" /><property name="jmeter.save.saveservice.output_format" value="xml"/></jmeter></target><path id="xslt.classpath"><fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/><fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/></path><target name="report"><tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp><xsltclasspathref="xslt.classpath"force="true"in="${jmeter.result.jtlName}"out="${jmeter.result.htmlName}"style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"><param name="dateReport" expression="${report.datestamp}"/></xslt><!-- 拷贝报告所需的图片资源至目标目录 --><copy todir="${jmeter.result.html.dir}"><fileset dir="${jmeter.home}/extras"><include name="collapse.png" /><include name="expand.png" /></fileset></copy></target>
</project>

配置完成后,利用Ant命令批量执行JMeter脚本:

ant -buildfile build.xml  # -buildfile 指定build.xml文件的位置

自动化报告在jenkins上配置ANT进行自动运行后,会发送运行结果报告。

7. 展望

随着互联网和金融行业不断地发布新的产品和对原有产品的版本迭代升级,软件测试在产品交付质量中起着关键的作用,无论是PC端和移动端的软件产品,它的底层原理都是依赖调用协议接口并访问数据库完成数据传输,因此接口测试在软件测试中扮演重要的角色。

基于持续集成的轻量级接口自动测试方案目的以保证系统的正确和稳定为核心,以持续集成为手段,提高测试效率,提升用户体验,降低产品研发成本。基于Jenkins持续集成的接口自动化测试框架,可以实现对产品的核心模块接口进行日常回归测试,以及对功能上线需求的接口重点监测,最大限度的减少底层 Bug 的出现数量,让功能和性能测试人员在测试的时候更加顺利,让产品研发的流程更加敏捷,缩短产品的研发周期。

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

基于持续集成的轻量级接口自动化测试 【持续更新...】相关推荐

  1. 基于持续集成的轻量级接口自动化测试

    1. 前言 Jenkins+Ant+Jmeter这一套自动化性能测试框架,分享给大家,给大家做一点参考. 2. 摘要 无论是互联网还是金融行业的产品都必须依赖大量的后台接口提供的服务,后台接口稳定与性 ...

  2. python 持续集成 教程_jenkins+python自动化测试持续集成教程

    一.首先我们安装Jenkins,我这里采用的是.msi应用程序,根据提示进行安装(傻瓜式),最后会打开默认的网页地址:http://localhost:8080 如果端口有冲突,可以去Jenkins的 ...

  3. jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...

  4. 实现Postman+Newman+Git+Jenkins+钉钉/邮件提醒接口自动化测试持续集成

    接口测试脚本一般的执行流程 目录 接口测试脚本一般的执行流程 Windows系统Newman安装 Centos系统Newman安装 命令行执行Postman脚本生成测试报告 Postman脚本持续集成 ...

  5. 能用机器完成的,千万别堆工作量|持续集成中的性能自动化测试

    1.背景 当前闲鱼在精益开发模式下,整个技术团队面临了诸多的能力落地和挑战,尤其是效能方面的2-1-1的目标(2周需求交付周期,1周需求开发周期,1小时达到发布标准),具体可见 闲鱼工程师是如何构建持 ...

  6. 能用机器完成的,千万别堆工作量|持续集成中的性能自动化测试 1

    1.背景 当前闲鱼在精益开发模式下,整个技术团队面临了诸多的能力落地和挑战,尤其是效能方面的2-1-1的目标(2周需求交付周期,1周需求开发周期,1小时达到发布标准),具体可见 闲鱼工程师是如何构建持 ...

  7. 【测试开发】的Devops持续集成部署体系之Jenkins持续集成和持续部署基础应用

    目录 [一]:Jenkins 持续集成安装及使用简介 一.前言 二.初始化 Jenkins 插件和管理员用户 2.1 进入如下页面,输入上面出现的口令 2.2 进入选择安装插件的页面后,可以选择安装社 ...

  8. 浅谈持续集成的理解以及实现持续集成,需要做什么?

    一.持续集成是什么? 持续集成是一种软件开发的实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化 ...

  9. 基于python+unittest简单实现接口自动化测试实战教程

    目录 1.前言 为什么要做接口自动化测试? 为什么要自己写框架呢? 2.一个现有的简单接口例子 接口信息如下 3.测试思路 原始脚本实现 未优化 优化 第一版 优化 第二版 优化 第三版 最终输出日志 ...

最新文章

  1. 清华大数据系列讲座——大数据发展与区块链应用成功举办
  2. kafka查看topic中的数据_实战!Kafka Manager能统计出Topic中的记录条数吗?
  3. JavaScript:window.event.srcElement(指触发事件的对象)
  4. JAVA8如何进行IDEA配置_IntelliJ Idea 配置jdk8
  5. 【智能车Code review】——小S与中S道路判断
  6. 【软件测试】白盒测试のN-S图
  7. 机器学习模型导出为PMML的方法
  8. Android MVP和Dagger2
  9. lambda函数 java_使用 Java 构建 Lambda 函数 - AWS Lambda
  10. tcpdump如何判断丢包_亿级规模的高可用微服务系统,如何轻松设计?
  11. [C编程在Linux上]用printf做彩色日志记录
  12. Google Guice简介
  13. 库存管理 库存管理软件榜单 库存管理软件排名 库存管理提高效率的办法
  14. 关于绩效考核及绩效面谈
  15. Matlab实现分组检测
  16. 计算机组成实验箱控制信号测,计算机组成原理实验报告-杨睿.doc
  17. WPF 延时操作实现 --- Application.DoEvents()
  18. 〖大前端 - 基础入门三大核心之CSS篇④〗- CSS选择器之元素关系选择器、序号选择器与属性选择器
  19. 【新手入门硬件】分压电路中阻抗匹配问题
  20. [AHK]为通达信画线工具中的文字注释功能增加热键

热门文章

  1. 【论文写作】毕业论文中容易栽的九个坑
  2. python字符串驻留机制_python的内存驻留机制(小数据池)
  3. 数据结构与算法之-----图(拓扑排序)
  4. 命令查看mysql 是否安装_验证mysql是否安装成功的方法
  5. 交换机工作原理_交换机你了解它吗?它工作原理是这样的
  6. 从编译器角度分析C语言中数组名和指针的区别
  7. 拉线分切质量在线检测系统
  8. 记一次zookeeper连接数暴增事件
  9. 深度学习入门:用MNIST完成Autoencoder(续)
  10. java中 String StringBuffer StringBuilder的区别