IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 基于持续集成的轻量级接口自动化测试【建议收藏】 -> 正文阅读

[开发测试]基于持续集成的轻量级接口自动化测试【建议收藏】

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

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>
        <xslt
            classpathref="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 的出现数量,让功能和性能测试人员在测试的时候更加顺利,让产品研发的流程更加敏捷,缩短产品的研发周期。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)

可以自助拿走,群号:310357728?群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦

如果对你有一点点帮助,各位的「点赞」就是小编创作的最大动力,我们下篇文章见!

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:38:55  更:2021-08-28 09:39:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 22:16:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码