Jmeter实现接口自动化设计说明
接口自动化测试方案
接口自动化测试方案第1篇接口自动化测试方案一、前言随着信息化建设的不断深入,接口在各个系统间的数据交互中扮演着举足轻重的角色。
为确保接口稳定、可靠且高效地运行,降低系统上线后因接口问题导致的故障风险,提高软件质量,特制定本接口自动化测试方案。
二、目标1. 提高接口测试的效率,降低人工测试成本。
2. 实现对接口的全面覆盖,确保接口的稳定性和可靠性。
3. 建立可持续集成的自动化测试体系,为项目的快速迭代提供支持。
三、测试范围1. 系统内部接口:包括各模块间的数据交互接口。
2. 系统外部接口:包括与第三方系统或服务的接口。
3. 数据库接口:涉及数据库操作的接口。
四、测试工具及环境1. 测试工具:JMeter、Postman、Swagger等。
2. 测试环境:开发环境、测试环境、预生产环境、生产环境。
3. 数据库:MySQL、Oracle、SQL Server等。
五、测试策略1. 功能测试:验证接口的功能是否符合需求规格说明书。
2. 性能测试:评估接口在高并发、大数据量下的性能表现。
3. 安全测试:检查接口是否存在安全漏洞,如SQL注入、越权访问等。
4. 兼容性测试:验证接口在不同操作系统、浏览器、数据库等环境下的兼容性。
5. 异常测试:模拟各种异常场景,检查接口的容错性。
六、测试流程1. 需求分析:分析接口的业务需求,明确接口的功能、性能、安全等要求。
2. 测试设计:根据需求分析,编写接口测试用例。
3. 测试开发:搭建测试环境,编写自动化测试脚本。
4. 测试执行:在各个测试环境中执行自动化测试。
5. 结果分析:分析测试结果,定位问题原因,反馈给开发人员。
6. 跟踪验证:验证开发人员修复的问题,确保问题得到解决。
7. 测试报告:输出测试报告,包括测试覆盖率、通过率、问题列表等。
七、测试用例设计1. 根据接口文档,设计测试用例,包括正常场景、异常场景。
2. 测试用例应涵盖接口的功能、性能、安全等各个方面。
jmeter界面说明
一、线程组1) setup thread group一种特殊类型的ThreadGroup的,可用于执行预测试操作。
这些线程的行为完全像一个正常的线程组元件。
不同的是,这些类型的线程执行测试前进行定期线程组的执行。
2) teardown thread group.一种特殊类型的ThreadGroup的,可用于执行测试后动作。
这些线程的行为完全像一个正常的线程组元件。
不同的是,这些类型的线程执行测试结束后执行定期的线程组。
可能你还是不太理他们与普通的线程组有什么不同。
如果您用过junit,想必你不会对setup ,teardown这2个字眼陌生。
即时每用过,也没关系。
熟悉loadrunner的应该知道,loadrunner的脚本除了action里是真正的脚本核心内容,还有初始化“环境”的初始化脚本和测试完毕后对应的清除信息的脚本块。
那么这里 setup thread group 和 teardown thread group 就是分别指这两部分。
其实从本质上来看,他们并没有什么不同。
3) thread group(线程组).这个就是我们通常添加运行的线程。
通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。
线程组中包含的线程数量在测试执行过程中是不会发生改变的。
二test fragment测试片段元素是控制器上的一个种特殊的线程组,它在测试树上与线程组处于一个层级。
它与线程组有所不同,因为它不被执行,除非它是一个模块控制器或者是被控制器所引用时才会被执行。
三、取样器(sampler)取样器(Sample)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler ,如 HTTP Request Sampler 、 FTP Request Sample 、TCP Request Sample 、JDBC Request Sampler 等,每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。
基于jmeter开展接口自动化测试方法探索与实践
开发测试DEVELOPMENT基于Jmeter开展接口自动化测试方法探索与实践中国农业银行研发中心 冯瑶 秦洪岩 刘跃光在自动化功能测试领域,按照业界普遍认同的单元级、接口级和UI界面级的7-2-1占比原则,接口级功能测试能够屏蔽案例对某些特殊环境依赖、适用范围广,可实现复杂案例设计,收益率适中(占比20%),可提前开展。
然而,接口级自动化测试一般需要依据系统接口特点和报文格式进行适应性开发,工具研发周期较长,因此,选择一款无需自行开发即可满足接口级的自动化测试工具非常有意义。
一、Jmeter简介Jmeter因支持对服务器进行大规模的高强度负载测试,用以检测不同并发数量下系统的整体性能情况,并可以通过内置的Jmeter控件,以文本表格或图形展示的形式生成吞吐量、响应时间等指标的统计分析,被广泛应用于性能测试。
该工具具有可移植性并支持多线程工作,允许通过多个线程并发取消,同时可以通过单独的线程组对多个不同的功能同时取样。
操作者可通过GUI 操作界面进行方便友好的操作。
此外,该工具具有高扩展性,其远程发压机可支持无限制的测试能力。
它不仅具有多种配置元件、处理器和监听器可供选择,还支持脚本编程、动态输入及自定义插件等,用户可根据自身需要进行功能扩展。
因此,针对Jmeter的高扩展性以及支持GUI界面等特性,本文结合使用Jmeter工具开展接口自动化功能测试实践进行了有益的探索并加以总结。
二、测试方法及步骤基于Jmeter进行接口功能测试主要分为报文准备、数据准备、断言设置、测试执行和结果统计等五个步骤,这种方法不仅适用于单交易场景,也适用于混合交易场景。
1.报文准备报文准备共有三种方法:直接复制粘贴报文、浏览器录制协议报文和手动添加参数。
(1)直接复制粘贴报文这种方法适用于开发人员已完成单元测试,此时开发人员可提供给测试人员能够直接使用的测试报文。
以HTTP请求为例,先在Jmeter工具里新建一个HTTP 请求,然后在Body Data中复制粘贴请求报文。
jmeter使用说明手册
Jmeter使用说明手册1.Jmeter的工作原理工作原理Jmeter作为web服务器与客户端之间的代理网关,它通过代理方式截获客户端和服务器之间交互的数据流,这样服务器和客户端都以为是在一个真实运行环境中。
2. 环境安装部署2.1 安装jdk注意事项JMeter3.2 以上的版本需要JDK1.8以上的版本支持运行。
JMeter可以运行在如下操作系统上: Unix,Windows和Open VMS;JAVA的环境变量设置a. 使用鼠标右击“我的电脑”->属性->高级->环境变量b. 系统变量->新建->变量名:JAVA_HOME 变量值:d:\jdkc. 系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;d. 系统变量->新建->变量名:CLASSPATH 变量值:e:运行->cmd->java version;Jdk下载地址:/technetwork/java/javase/downloads/jdk8-downloads-2133 151.html2.2 安装及运行jmeter;解压zip/tar文件到你想安装JMeter的目录;运行解压后的bin目录下的 jmeter.bat;如图所示:2.2.1jmeter 目录介绍a.bin目录:可执行的目录1).jmeter.bat:windows的启动文件2).jmeter.log:日志文件3).jmeter.sh:linux的启动文件4).jmeter.properties:系统配置文件5).jmeter-server.bat :windows分布式测试要用到的服务器配置6).jmeter-serve:linux分布式要用到的服务器配置7).docs目录:接口文档目录b.extras目录:扩展插件目录c.lib目录:所用到的插件目录,里面都是jar包,会自动在JMETER_HOME/lib和ext 目录下寻找需要的类d.liceses:jmeter证书目录f.ptinrable_docs 用户使用手册Jmeter下载地址:/download_jmeter.cgi3.建立一个基本的测试计划4.Jmeter各元素的使用说明4.1线程介绍---Test plan(测试计划)---------setup threads group(环境初始化)---------thread group---------thread group...---------tear down group(环境恢复)Test plan:用来描述一个自动化测试,本次需要执行的测试范围,类似testlink上的测试计划。
Jmeter(GUI模式)教程
Jmeter(GUI模式)教程前些天,领导让我做接⼝的压⼒测试。
What??我从未接触过这⽅⾯,什么都不知道,⼀脸蒙。
于是我从学习jmeter开始⼊⼿。
现在记录下来jmeter的使⽤步骤,希望能对⼤家有所帮助。
⼀、安装Jmeter1、电脑安装Java,并配置环境变量,步骤见:2、下载,解压到本地。
3、进⼊/Jmeter/bin,双击jmeter,打开软件。
jmeter⼆、Jmeter⼯作原理Jmeter可以作为Web服务器与浏览器之间的代理⽹关,以便捕获浏览器的请求和Web服务器的响应,如此就可以很容易的⽣成性能测试脚本。
有了性能测试脚本,Jmeter就可以通过线程组来模拟真实⽤户对Web服务器的访问压⼒。
这与LoadRunner的⼯作原理基本⼀致。
⼯作原理三、Jmeter操作步骤Jmeter界⾯1、测试计划测试计划描述了Jmeter运⾏时将会执⾏的⼀系列步骤。
⼀个完善的测试计划,会包含⼀个或多个线程组、逻辑控制器、采样器、监听器、定时器、断⾔和配置元件2、线程组线程组是任何测试计划的起点,所有的逻辑控制器和采样器都必须放在线程组之下。
其他的测试元件可以被直接放在测试计划之下,这些测试元件对所有线程组都⽣效。
线程组就像它的名称所描述的,被⽤来管理执⾏性能测试所需的Jmeter线程。
⽤户通过线程组的控制⾯板可以:· 设置线程数量· 设置线程启动周期Period· 设置执⾏测试脚本的循环次数· 设置持续时间· 设置启动延时时间· 设置启动时间和结束时间参数Ramp-Up Period 告诉Jmeter 达到最⼤线程数所需的时间。
假定共有10个线程,Ramp-Up Period为100秒,那么Jmeter就会在100秒内启动这10个线程,并让它们运转起来。
每⼀个测试线程都会在上⼀个线程启动10秒之后才开始运⾏。
注意⚠ :参数Ramp-Up Period不能设定的太短,否则在测试初始阶段会给予服务器过⼤的压⼒。
JMETER接口测试用户手册
JMETER接口测试用户操作手册1 第1页共43目录第一章.概述 (4)1.1编写目的 (4)1.2 JMETER 基本介绍以及使用原因 (4)第二章JMETER安装说明 (5)2.1.安装说明 (5)第三章接口测试环境配置 (9)3.1 添加一个线程组 (9)3.2 添加HTTP 请求默认值 (10)3.3 添加结果监听器 (11)3.4 添加http 请求 (12)3.5 添加响应断言 (13)3.6 添加断言结果 (13)第四章配置请求并执行测试 (14)4.1 配置接口地址信息 (14)4.2 添加业务参数 (15)4.3 添加断言 (16)4.4 执行测试 (17)4.5 同时测试多个接口 (19)4.6 脚本导出操作 (19)第五章接口测试与数据驱动 (21)5.1简介 (21)5.2 数据驱动与jmeter接口测试 (21)第六章Jmeter接口测试与持续集成 (25)6.1 简介 (25)6.2 安装ANT (25)6.3 ANT中配置Jmeter (26)6.4 配置jenkins (35)第七章附录 (39)7.1 接口设计文档信息示例 (39)第一章.概述1.1编写目的本文档用于主要用于介绍Jmeter工具安装及其做接口测试的基本操作。
1.2 JMETER 基本介绍以及使用原因Jmeter 是Apache 组织开发的基于JA V A 的压力测试工具,是目前业内主流的开源压力测试工具及HTTP接口自动化测试工具。
我们选择Jmeter做接口测试的原因,主要基于以下几点:(1)Jmeter是市场上主流的开源接口测试工具,即它是免费的(2)Jmeter可以调用不同类型的网络接口,http、https、ftp等等(3)具备PostMan、fiddler等接口测试工具不具备的自动化测试能力(4)Jmeter安装简单,也可以说是免安装的,解压即可用(5)可以与其他工具搭配,构建持续集成测试环境第一章JMETER安装说明2.1.安装说明2.1.1、下载◆首先我们需要打开Apache官网:https:///◆官网主页拉到最底端,找到jmeter,点击进入jmeter主页◆进入下载页面,点击download releases找到最新的jmeter.zip包,下载即可,注意:如下图所示,我们需要先安装jdk1.7以上的版本。
压测工具--jmeter之线程数设置
压测⼯具--jmeter之线程数设置
⼀、在进⾏接⼝性能⾃动化测试过程中,压测的⽅法有2种:
同时并发:设置线程组、执⾏时间、循环次数,这种⽅式可以控制接⼝请求的次数。
持续压测:设置线程组、循环次数勾选永远、调度器(持续时间),这种⽅式可以控制压测周期时间
指定并发场景⼀:使10个线程启动并同时运⾏==并发执⾏10个线程。
10个线程为⼀个样本,每个样本循环执⾏5次,可⽤监听树查看线程组执⾏效果,是10个⼀起出现。
1. 设置线程数(users):10
2. 设置执⾏时间:0
3. 设置循环次数:5
指定并发场景⼆:20s执⾏完成10个线程,也就是⼀个线程执⾏完后隔2秒执⾏下⼀个线程。
10个线程为⼀个样本,每个样本执⾏5次。
使⽤监听树查看,请求是有间隔出现的。
1. 设置线程数(users):10
2. 设置执⾏时间:20
3. 设置循环次数:5
持续压测:
当领导说要对某个接⼝持续24h的压测,这种情况需要⽤到jmeter线程组的调度器功能。
调度器可以控制压测持续的时间和线程启动延迟的时间。
1. 循环次数:选择’永远‘
2. 设置持续时间
3. 设置启动延迟时间
持续压测场景三:10个线程同时并发执⾏。
只需循环60s,不限制样本数(10个线程间隔0s并发进⾏)
1. 设置线程数(users):10
2. 设置执⾏时间:0
3. 设置循环次数:勾选永远
4. 使⽤调度器,设置持续时间:60。
jmeter调用接口常用方法
jmeter调用接口常用方法全文共四篇示例,供读者参考第一篇示例:JMeter是一个广泛使用的压力测试工具,可以用来测试Web应用程序的性能以及对接口进行测试。
在实际工作中,调用接口是JMeter的一个重要功能之一,接口测试可以帮助我们验证接口的正确性、稳定性和性能。
在JMeter中,调用接口的方法有很多种,本文将详细介绍JMeter调用接口常用方法。
1. HTTP Request在JMeter中,使用HTTP Request可以向服务器发送HTTP请求,常用于模拟用户访问Web页面或调用后端接口。
使用HTTP Request 需要配置请求的URL、请求方式(GET、POST等)、请求头、请求参数等信息。
在JMeter的工作台中,选择添加“Thread Group”后右键点击Thread Group,选择Add -> Sampler -> HTTP Request,然后按照提示填入相关信息即可。
2. JSR223 SamplerJSR223 Sampler是JMeter提供的一个自定义脚本执行器,可以使用多种脚本语言编写脚本,并在JMeter中执行。
在调用接口时,我们可以通过编写脚本实现更加灵活的定制化操作。
可以在脚本中添加逻辑判断、循环操作、动态参数等。
在JMeter的工作台中,选择添加“Thread Group”后右键点击Thread Group,选择Add -> Sampler -> JSR223 Sampler,然后选择脚本语言,并编写自定义脚本即可。
BeanShell Sampler是JMeter提供的另一个自定义脚本执行器,支持BeanShell脚本语言。
与JSR223 Sampler类似,BeanShell Sampler也可以用于执行自定义脚本。
需要注意的是,在JMeter 3.1及之后的版本中,BeanShell Sampler已经被标记为“不推荐使用”,建议使用JSR223 Sampler代替。
JMeter接口自动化测试实例—JMeter引用javaScript
JMeter接⼝⾃动化测试实例—JMeter引⽤javaScript Jmeter提供了JSR223 PreProcessor前置处理器,通过该⼯具融合了Java 8 Nashorn 脚本引擎,可以执⾏js脚本以便对脚本进⾏前置处理。
其中⽐较典型的应⽤就是通过执⾏js脚本对前端数据进⾏rsa加密,如登录密码加密。
但在这⾥我就简单的应⽤javaScript⽣成当前时间来做为例⼦,看如何在JMeter中使⽤JavaScript脚本的。
整个实例就是为了演⽰在JSR223 PreProcessor中⽣成HTTP请求的⼀个⼊参,然后得到响应后,可以通过JSON Extractor取出指定想到的信息,再通过BeanShell Assertion进⾏简单的校验断⾔,如果⼀直没有问题,再发起⼀个HTTP请求,其中的⼀个参数就是上⼀个HTTP请求响应解析⼊来的值。
先来看JSR223 PreProcessor,内容如下: 其实就是通过JavaScript代码获得当前系统时间,转换成指定格式,设置到变量⾥。
然后在接下来的HTTP请求中应⽤这个变量。
然后是JSON Extractor从响应体中提取信息(特别说明:响应体是JSON格式的) 接下来就是断⾔,在这⾥⽤BeanShell Assertion来做,如下所⽰: 接下来的HTTP请求,有⽤来前⾯设置的变量和响应解析出来的变量。
运⾏结果如下: 第⼀个请求的时间是当前时间,第⼆个请求的时间也是第⼀个请求前设置的时间,且radomCode就是第⼀个请求响应体通过JSON Extractor解析提取出来的变量值,且对第⼀个请求的BeanShell Assertion是通过的(不通过会结果树会显⽰红⾊且显⽰出错信息)。
Jmeter接口自动化-脚本数据分离实例
Jmeter接⼝⾃动化-脚本数据分离实例⼀、背景:为了让⼤家更加的了解Jmeter,并且使⽤起来游刃有余。
这篇我们主要讲⼀下,如何优雅的使⽤Jmeter⼀步步的实现接⼝⾃动化,完成脚本与数据分离,把可能对Jmeter脚本的维护转移到csv⽂本中,降低接⼝变更时对脚本的维护,最终⽬标是实现写好接⼝⾃动化脚本后,接⼝变更的维护都只要操作csv⽂件。
Jmeter脚本,数据和报告地址:testerhome地址:⼆、实例先介绍⼀个Jmeter的函数-》csvRead函数,后续介绍使⽤的会⽐较多,熟悉的伙伴可以直接跳过。
1、csvRead函数使⽤:csvRead函数是从外部读取参数,可以从⼀个⽂件中读取多个参数。
使⽤步骤:1、先新建⼀个⽂件,例如test.csv(或test.txt),⾥⾯的数据存放为grizz,qq1111jiezai,qq1111⽂件为⽤户名和密码,⽤逗号隔开,每⼀列表⽰⼀种参数,每⼀⾏则表⽰⼀组参数。
2、选项-》函数助⼿对话框-》函数助⼿,打开Jmeter的函数助⼿,选择csvRead函数:其中:CSV file to get values from | *alias:要读取的⽂件路径,为绝对路径CSV⽂件列号| next| *alias:从第⼏列开始读取,注意第⼀列是0即${__CSVRead(D:/test.csv,0)}取到的值为grizz即${__CSVRead(D:/test.csv,1)}取到的值为qq11113.Jmeter执⾏的时候,如果有多个线程,顺序读取每⾏的数据,如果线程组多于⽂件中的⾏数,则循环读取。
如线程数为2,则第2个线程读取的是第⼆⾏的数据,线程数为3,线程数3⼤于⽂件中的⾏数2,则第3个线程读取的是第⼀⾏的数据。
PS:这⼀函数并不适合于读取很⼤的⽂件,因为整个⽂件都会被存储到内存之中。
对于较⼤的⽂件,请使⽤配置元件CSV Data Set或者StringFromFile 。
完整的JMETER使用手册
JMETER中文手册1. 简介Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序)。
它可以用来测试包括基于静态和动态资源程序的性能,例如静态文件,Java Servlets,Java 对象,数据库,FTP 服务器等等。
JMeter可以用来在一个服务器、网络或者对象上模拟重负载来测试它的强度或者分析在不同的负载类型下的全面性能。
另外,JMeter能够通过让你们用断言创建测试脚本来验证我们的应用程序是否返回了我们期望的结果,从而帮助我们回归测试我们的程序。
为了最大的灵活性,JMeter允许我们使用正则表达式创建断言。
1.1 历史Apache软件组织的Stefano Mazzocchi是JMeter的创始人。
他编写它起初是为了测试Apache JServ的性能(一个已经被Apache Tomcat工程所替代的工程)。
我们重新设计JMeter来增强用户界面并增加功能测试的能力。
1.2 未来我们希望看到作为开发者利用它的可插入架构使JMeter的功能快速扩展。
未来发展的主要目标是在没有影响JMeter的负载测试能力的情况下尽可能使JMeter 成为最实用的回归测试工具。
2. 入门开始使用JMeter最容易的方法是首先下载最新版并且安装它。
这个版本包含所有你在构建和运行Web,FTP,JDBC,和JNDI等测试时使用需要的所有文件。
如果你想执行JDBC测试,你当然需要从供应商得到适当的JDBC驱动。
JMeter 没有提供任何JDBC驱动。
你可能需要下载的其它软件:∙BeanShell- BeanShell函数和测试元件需要∙Java Activation Framework- JavaMail需要∙Java Mail- Mail可视化,Mail Reader 和WebService(SOAP)取样器需要∙JMS- JMS 取样器需要∙General Java download page详细参见JMeter Classpath一章安装附加的jar包∙下一步, 开始使用JMeter并且参见用户手册创建一个测试计划一章使自己更加熟悉JMeter基础 (例如,添加和删除元件)。
Jmeter+selenium+ant接口自动化并生成报告
Jmeter+selenium+ant接⼝⾃动化并⽣成报告⼀、数据准备这⾥不详细介绍Jmeter的使⽤⽅法,重点介绍jmeter与ant的整合1、添加测试计划-->执⾏测试⽤例-->成功后⽂件另存为.jmx⽂件2、在jmeter的⽬录下新建TestCase⽂件夹3、将该.jmx⽂件存放⾄该⽂件夹下⼆、⼯具准备2、添加环境变量:新建系统变量ANT_HOME在path环境变量中加⼊%ANT_HOME%\bin(注意前⾯分号)3、确认ant环境配置,打开cmd命令提⽰符,输⼊ant -v,出现如下图说明环境配置OK三、整合1、把Jmeter根⽬录\extras下的ant-jmeter-xxx.jar拷贝到ant的根⽬录\lib下To2、将jmeter的根⽬录\extras下的build.xml⽂件复制⼀份到新建的⽂件TestCase⾥去四、修改配置1、修改build.xml⽂件如下2、修改jmeter.properties配置⽂件jmeter.save.saveservice.output_format=csv改为jmeter.save.saveservice.output_format=xml五、⽣成报告1、⽅法⼀:打开cmd命令提⽰符,进⼊build.xml所在⽬录的根⽬录,执⾏ant命令,⼀份简单的报告就这样⽣成了。
2、⽅法⼆:在build.xml同级⽬录创建⼀个build.bat⽂件,⽂件内容为ant,然后双击build.bat,jmeter脚本即可⾃动运⾏并在指定位置⽣成对应的测试报告六、优化报告上述⽣成的报告看起来成功,但如出错很难从报告上定位问题,并定位问题在哪⾥优化过程:1、jmeter默认的报告展⽰信息⽐较少,其实是由.jtl格式转化为.html格式的报告过程中style⽂件起了很关键的作⽤。
这⾥介绍另⼀种style⽂件的使⽤⽅法:A) 下载style⽂件:jmeter.results.shanhe.me.xsl ,该⽂件可⾃⾏⽹上搜索;作者使⽤的是 hph_report.xsl,将上述 build.xml 中 report sytle 值修改为此⽂件名B) 把下载的⽂件放到jmeter的extras⽬录下;2、修改JMeter.properties⽂件如下部分,我这⾥都修改成true,这样执⾏完脚本后就会保存这些结果到.jtl⽂件1 jmeter.save.saveservice.response_code=true2 # response_data is not currently supported for CSV output3 jmeter.save.saveservice.response_data=true4 # Save ResponseData for failed samples5 jmeter.save.saveservice.response_data.on_error=false6 jmeter.save.saveservice.response_message=true7 jmeter.save.saveservice.successful=true8 jmeter.save.saveservice.thread_name=true9 jmeter.save.saveservice.time=true10 jmeter.save.saveservice.subresults=true11 jmeter.save.saveservice.assertions=true12 #tency=true13 # Only available with HttpClient414 jmeter.save.saveservice.connect_time=true15 jmeter.save.saveservice.samplerData=true16 jmeter.save.saveservice.responseHeaders=true17 jmeter.save.saveservice.requestHeaders=true18 jmeter.save.saveservice.encoding=true19 #jmeter.save.saveservice.bytes=true20 # Only available with HttpClient421 jmeter.save.saveservice.sent_bytes=true22 jmeter.save.saveservice.url=true23 jmeter.save.saveservice.filename=true24 jmeter.save.saveservice.hostname=true25 jmeter.save.saveservice.thread_counts=true26 jmeter.save.saveservice.sample_count=true27 jmeter.save.saveservice.idle_time=truejmeter.property3、修改build.xml⽂件,附上⾃⼰的原⽂件,修改⼀下⾃⼰的 jmeter 环境变量地址<?xml version="1.0" encoding="UTF-8"?><!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License at/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><project name="ant-jmeter" default="all" basedir="."><tstamp><format property="time" pattern="yyyy/MM/dd HH:mm"/><format property="timelog" pattern="yyyyMMddHHmm"/><format property="timeyj" pattern="MMddyyyHHmm"/></tstamp><description>Sample build file for use with ant-jmeter.jarSee /pages/projects/jmeter-ant-task.phpTo run a test and create the output report:ant -Dtest=scriptTo run a test only:ant -Dtest=script runTo run report on existing test outputant -Dtest=script reportThe "script" parameter is the name of the script without the .jmx suffix.Additional options:-Dshow-data=y - include response data in Failure Details-Dtestpath=xyz - path to test file(s) (default user.dir).N.B. Ant interprets relative paths against the build file-Djmeter.home=.. - path to JMeter home directory (defaults to parent of this build file)-Dreport.title="My Report" - title for html report (default is 'Load Test Results')</description><property name="jmeter.home" value="这⾥为 jmeter环境变量⽬录"/><property name="testpath" value="${jmeter.home}/TestCase"/><property name="jmeter.result.jtl.dir" value="${jmeter.home}/TestCase/report/jtl"/><property name="jmeter.result.html.dir" value="${jmeter.home}/TestCase/report/html"/><property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${timelog}.jtl"/><property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${timelog}.html"/> <property name="jmeter.result.htmlNameyj" value="${jmeter.result.html.dir}/${ReportName}${timeyj}.html"/> <property name="lib.dir" value="${jmeter.home}/lib"/><property name="ReportName" value="TestReport"/><!-- Name of test (without .jmx) --><property name="test" value="这⾥填写 jmeter 脚本名称,注意不含.jmx"/><!-- Should report include response data for failures? --><property name="show-data" value="n"/><property name="format" value="2.1"/><condition property="style_version" value="_21"><equals arg1="${format}" arg2="2.1"/></condition><condition property="funcMode"><equals arg1="${show-data}" arg2="y"/></condition><condition property="funcMode" value="false"><not><equals arg1="${show-data}" arg2="y"/></not></condition><!-- Allow jar to be picked up locally (jmeter 相对应 ant-jmeter-1.1.1.jar 包存放地址及包名设置)--><path id="jmeter.classpath"><fileset dir="${jmeter.home}/extras"><include name="ant-jmeter*.jar"/></fileset></path><taskdefname="jmeter"classpathref="jmeter.classpath"classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/><!--运⾏的顺序,先 run test 后 report --><target name="all" depends="run,report"/><target name="run"><echo>funcMode = ${funcMode}</echo><delete file="${jmeter.result.html.dir}/${test}.html"/><jmeterjmeterhome="${jmeter.home}"testplan ="${testpath}/${test}.jmx"resultlog="${jmeter.result.jtl.dir}/${test}.jtl"><!--<jvmarg value="-Xincgc"/><jvmarg value="-Xmx128m"/><jvmarg value="-Dproperty=value"/><jmeterarg value="-qextra.properties"/>--><!-- Force suitable defaults jmeter相对应配置要改为 true--><property name="jmeter.save.saveservice.response_data" value="true"/><property name="jmeter.save.saveservice.samplerData" value="true"/><property name="jmeter.save.saveservice.responseHeaders" value="true"/><property name="jmeter.save.saveservice.requestHeaders" value="true"/><property name="jmeter.save.saveservice.encoding" value="true"/><property name="jmeter.save.saveservice.url" value="true"/><property name="jmeter.save.saveservice.filename" value="true"/><property name="jmeter.save.saveservice.hostname" value="true"/><property name="jmeter.save.saveservice.thread_counts" value="true"/><property name="jmeter.save.saveservice.sample_count" value="true"/><property name="jmeter.save.saveservice.idle_time" value="true"/><property name="jmeter.save.saveservice.output_format" value="xml"/><property name="jmeter.save.saveservice.assertion_results" value="all"/><property name="jmeter.save.saveservice.bytes" value="true"/><property name="file_format.testlog" value="${format}"/><property name="jmeter.save.saveservice.response_data.on_error" value="${funcMode}"/></jmeter></target><property name="lib.dir" value="${jmeter.home}/lib"/><!-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ --><path id="xslt.classpath"><fileset dir="${lib.dir}" includes="xalan*.jar"/><fileset dir="${lib.dir}" includes="serializer*.jar"/></path><target name="report" depends="xslt-report,copy-images"><echo>Report generated at ${report.datestamp}</echo></target><!-- 报告样式设置 --><target name="xslt-report" depends="_message_xalan"><tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp><xsltclasspathref="xslt.classpath"force="true"in="${jmeter.result.jtl.dir}/${test}.jtl"out="${jmeter.result.html.dir}/${test}.html"style="${jmeter.home}/extras/jmeter-results-hph_report.xsl"><param name="showData" expression="${show-data}"/><param name="titleReport" expression="${report.title}"/><param name="dateReport" expression="${report.datestamp}"/></xslt></target><!-- Copy report images if needed --><target name="copy-images" depends="verify-images" unless="samepath"><copy file="${basedir}/expand.png" tofile="${testpath}/expand.png"/><copy file="${basedir}/collapse.png" tofile="${testpath}/collapse.png"/></target><target name="verify-images"><condition property="samepath"><equals arg1="${testpath}" arg2="${basedir}"/></condition></target><!-- Check that the xalan libraries are present --><condition property="xalan.present"><and><!-- No need to check all jars; just check a few --><available classpathref="xslt.classpath" classname="org.apache.xalan.processor.TransformerFactoryImpl"/><available classpathref="xslt.classpath" classname="org.apache.xml.serializer.ExtendedContentHandler"/></and></condition><target name="_message_xalan" unless="xalan.present"><echo>Cannot find all xalan and/or serialiser jars</echo><echo>The XSLT formatting may not work correctly.</echo><echo>Check you have xalan and serializer jars in ${lib.dir}</echo></target></project>build.xml将此⽂件覆盖原jmeter-result-report.xsl1<?xml version="1.0" encoding="UTF-8"?>2<xsl:stylesheet xmlns:xsl="/1999/XSL/Transform" version="1.0">3<xsl:output method="html" indent="no" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="/TR/html4/loose.dtd"/>4<xsl:strip-space elements="*"/>5<xsl:template match="/testResults">6<html lang="en">7<head>8<meta name="Author" content="shanhe.me"/>9<title>JMeter Test Results</title>10<style type="text/css"><![CDATA[1112 * { margin: 0; padding: 0 }13 html, body { width: 100%; height: 100%; background: #b4b4b4; font-size: 12px }14 table { border: none; border-collapse: collapse; table-layout: fixed }15 td { vertical-align: baseline; font-size: 12px }16 #left-panel { position: absolute; left: 0; top: 0; bottom: 0; width: 300px; overflow: auto; background: #dee4ea }17 #left-panel li.navigation { font-weight: bold; cursor: default; color: #9da8b2; line-height: 18px; background-position: 12px 5px; background-repeat: no-repeat; padding: 0 0 0 25px; background-image: url(data:image/png;base64,iVBOR18 #left-panel li.success { color: #565b60 }19 #left-panel li.failure { color: red }20 #left-panel li { list-style: none; color: black; cursor: pointer }21 #left-panel li.selected { background-repeat: repeat-x; color: white; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAYAAABMDlehAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAA22 #left-panel div { line-height: 25px; background-position: 25px 3px; background-repeat: no-repeat; padding: 0 0 0 45px }23 #left-panel div.success { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcG24 #left-panel div.failure { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGA25 #left-panel div.detail { display: none }26 #right-panel { position: absolute; right: 0; top: 0; bottom: 0; left: 301px; overflow: auto; background: white }27 #right-panel .group { font-size: 12px; font-weight: bold; line-height: 20px; padding: 0 0 2px 18px; counter-reset: assertion; background-repeat: repeat-x; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA28 #right-panel .zebra { background-repeat: repeat; padding: 0 0 20px 18px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAmCAYAAAAFvPEHAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A29 #right-panel .data { line-height: 24px; white-space: nowrap}30 #right-panel pre.data { white-space: pre-line}31 #right-panel tbody.failure { color: red }32 #right-panel td.key { min-width: 108px }33 #right-panel td.delimiter { min-width: 18px }34 #right-panel td.assertion:before { counter-increment: assertion; content: counter(assertion) ". " }35 #right-panel td.assertion { color: black }36 #right-panel .trail { border-top: 1px solid #b4b4b4 }3738]]></style>39<script type="text/javascript"><![CDATA[4041 var onclick_li = (function() {42 var last_selected = null;43 return function(li) {44 if( last_selected == li )45 return;46 if( last_selected )47 last_selected.className = "";48 last_selected = li;49 last_selected.className = "selected";50 var detail = li.querySelector('div.detail');51 // deleted52 //document.getElementById("right-panel").innerHTML = last_selected.firstChild.nextSibling.innerHTML;53 // add54 document.getElementById("right-panel").innerHTML = detail.innerHTML;55 return false;56 };57 })();5859 var patch_timestamp = function() {60 var spans = document.getElementsByTagName("span");61 var len = spans.length;62 for( var i = 0; i < len; ++i ) {63 var span = spans[i];64 if( "patch_timestamp" == span.className )65 span.innerHTML = new Date( parseInt( span.innerHTML ) );66 }67 };6869 var patch_navigation_class = (function() {7071 var set_class = function(el, flag) {72 if(el) {73 el.className += flag ? " success" : " failure";74 }75 };7677 var traverse = function(el, group_el, flag) {78 while(1) {79 if(el) {80 if(el.className == 'navigation') {81 set_class(group_el, flag);82 group_el = el;83 flag = true;84 } else {85 var o = el.firstChild;86 o = o ? o.className : null;87 flag = flag ? (o == 'success') : false;88 }89 el = el.nextSibling;90 } else {91 set_class(group_el, flag);92 break;93 }94 }95 };9697 return function() {98 var o = document.getElementById("result-list");99 o = o ? o.firstChild : null;100 if(o)101 traverse(o, null, true);102 };103 })();104105 window.onload = function() {106 patch_timestamp();107 patch_navigation_class();108 // deleted109 //var o = document.getElementById("result-list");110 //o = o ? o.firstChild : null;111 //o = o ? o.nextSibling : null;112 // add113 var o = document.querySelector('li[onclick]');114 if(o)115 onclick_li(o);116 };117118]]></script>119</head>120<body>121<div id="left-panel">122<ol id="result-list">123<li onclick="return onclick_li(this);">124<div>测试结果概况</div>125<div class="detail">126<div class="zebra">127<xsl:call-template name="summary"/>128</div>129<div class="zebra">130<xsl:call-template name="pagelist"/>131</div>132</div>133</li>134<xsl:for-each select="*">135<!-- group with the previous sibling -->136<!--137 <xsl:if test="position() = 1 or @tn != preceding-sibling::*[1]/@tn">138 <li class="navigation">Thread: <xsl:value-of select="@tn"/></li>139 </xsl:if>140-->141<li onclick="return onclick_li(this);">142<div>143<xsl:attribute name="class">144<xsl:choose>145<xsl:when test="@s = 'true'">success</xsl:when>146<xsl:otherwise>failure</xsl:otherwise>147</xsl:choose>148</xsl:attribute>149<xsl:value-of select="@lb"/>150</div><div class="detail">151<div class="group">Sampler</div>152<div class="zebra">153<table>154<tr><td class="data key">Thread Name</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@tn"/></td></tr>155<tr><td class="data key">Timestamp</td><td class="data delimiter">:</td><td class="data"><span class="patch_timestamp"><xsl:value-of select="@ts"/></span></td></tr>156<tr><td class="data key">Time</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@t"/> ms</td></tr>157<tr><td class="data key">Latency</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@lt"/> ms</td></tr>158<tr><td class="data key">Bytes</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@by"/></td></tr>159<tr><td class="data key">Sample Count</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@sc"/></td></tr>160<tr><td class="data key">Error Count</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@ec"/></td></tr>161<tr><td class="data key">Response Code</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@rc"/></td></tr>162<tr><td class="data key">Response Message</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@rm"/></td></tr>163</table>164</div>165<div class="trail"></div>166<xsl:if test="count(assertionResult) > 0">167<div class="group">Assertion</div>168<div class="zebra">169<table>170<xsl:for-each select="assertionResult">171<tbody>172<xsl:attribute name="class">173<xsl:choose>174<xsl:when test="failure = 'true'">failure</xsl:when>175<xsl:when test="error = 'true'">failure</xsl:when>176</xsl:choose>177</xsl:attribute>178<tr><td class="data assertion" colspan="3"><xsl:value-of select="name"/></td></tr>179<tr><td class="data key">Failure</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="failure"/></td></tr>180<tr><td class="data key">Error</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="error"/></td></tr>181<tr><td class="data key">Failure Message</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="failureMessage"/></td></tr>182</tbody>183</xsl:for-each>184</table>185</div>186<div class="trail"></div>187</xsl:if>188<div class="group">Request</div>189<div class="zebra">190<table>191<tr><td class="data key">Method/Url</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="method"/><xsl:text></xsl:text><xsl:value-of select=".URL" 192<tr><td class="data key">Query String</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="queryString"/></pre></td></tr>193<tr><td class="data key">Cookies</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="cookies"/></pre></td></tr>194<tr><td class="data key">Request Headers</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="requestHeader"/></pre></td></tr>195</table>196</div>197<div class="trail"></div>198<div class="group">Response</div>199<div class="zebra">200<table>201<tr><td class="data key">Response Headers</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="responseHeader"/></pre></td></tr>202<tr><td class="data key">Response Data</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="responseData"/></pre></td></tr>203<tr><td class="data key">Response File</td><td class="data delimiter">:</td><td class="data"><pre class="data"><xsl:value-of select="responseFile"/></pre></td></tr>204</table>205</div>206<div class="trail"></div>207</div>208</li>209</xsl:for-each>210</ol>211</div>212<div id="right-panel"></div>213<script>214 Spliter = function (objLeft, objRight) {215 this.flag = false;216 var ele = document.createElement('div');217 document.body.append(ele);218 ele.style.height = "100%";219 ele.style.position = "absolute";220 ele.style.width = "5px";221 ele.style.left = objLeft.offsetWidth - 2 + "px";222 ele.style.backgroundColor = "gray";223 ele.style.opacity = 0;224225 this.ele = ele226 this.objLeft = objLeft;227 this.objRight = objRight;228 this.ele.style.cursor = "w-resize"; //设置⿏标样式229 this.up = function (event) {230 if (this.flag) {231 if (this.ele.releaseCapture) {232 this.ele.releaseCapture();233 }234 else {235 document.removeEventListener('mouseup', this.up.bind(this), true);236 document.removeEventListener('mousemove', this.move.bind(this), true);237 event.preventDefault();238 }239240 this.ele.style.opacity = 0;241 this.flag = false;242 }243 };244 this.down = function (event) {245 if (!this.flag) {246 if (this.ele.setCapture)247 this.ele.setCapture();248 else {249 document.addEventListener('mouseup', this.up.bind(this), true);250 document.addEventListener('mousemove', this.move.bind(this), true);251 event.preventDefault();252 }253254 this.ele.style.opacity = 0.5;255 this.flag = true;256 }257 };258 this.move = function (event) {259260 if (this.flag) {261 var minWidth = 10;262 var left = Math.max(minWidth, event.clientX);263 this.objLeft.style.width = left + "px";264 this.objRight.style.left = left + "px";265 this.ele.style.left = left - 2 + "px";266 if (!this.ele.releaseCapture) {267 event.preventDefault();268 }269 }270 }271 var t = this;272 this.ele.onmousedown = function () {273 t.down(event);274 }275276 this.ele.onmouseup = function () {277 t.up(event);278 }279280 this.ele.onmousemove = function () {281 t.move(event);282 }283 return this;284 }285286 new Spliter(document.getElementById("left-panel"), document.getElementById("right-panel"));287</script>288</body>289290</html>291</xsl:template>292<xsl:template name="summary">293<div class="group">Summary</div>294<table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%">295<tr valign="top">296<th>请求总数</th>297<th>异常数</th>298<th>成功率</th>299<th>平均消耗时间</th>300<th>最⼩消耗时间</th>301<th>最⼤消耗时间</th>302</tr>303<tr valign="top">304<xsl:variable name="allCount" select="count(/testResults/*)"/>305<xsl:variable name="allFailureCount" select="count(/testResults/*[attribute::s='false'])"/>306<xsl:variable name="allSuccessCount" select="count(/testResults/*[attribute::s='true'])"/>307<xsl:variable name="allSuccessPercent" select="$allSuccessCount div $allCount"/>308<xsl:variable name="allTotalTime" select="sum(/testResults/*/@t)"/>309<xsl:variable name="allAverageTime" select="$allTotalTime div $allCount"/>310<xsl:variable name="allMinTime">311<xsl:call-template name="min">312<xsl:with-param name="nodes" select="/testResults/*/@t"/>313</xsl:call-template>314</xsl:variable>315<xsl:variable name="allMaxTime">316<xsl:call-template name="max">317<xsl:with-param name="nodes" select="/testResults/*/@t"/>318</xsl:call-template>319</xsl:variable>320<xsl:attribute name="class">321<xsl:choose>322<xsl:when test="$allFailureCount > 0">Failure</xsl:when>323</xsl:choose>324</xsl:attribute>325<td align="center">326<xsl:value-of select="$allCount"/>327</td>328<xsl:if test="$allFailureCount > 0">329<td align="center" style="color:red">330<xsl:value-of select="$allFailureCount"/>331</td>332</xsl:if>333<xsl:if test="0 >= $allFailureCount">334<td align="center">335<xsl:value-of select="$allFailureCount"/>336</td>337</xsl:if>338<td align="center">339<xsl:call-template name="display-percent">340<xsl:with-param name="value" select="$allSuccessPercent"/>341</xsl:call-template>342</td>343<td align="center">344<xsl:call-template name="display-time">345<xsl:with-param name="value" select="$allAverageTime"/>346</xsl:call-template>347</td>348<td align="center">349<xsl:call-template name="display-time">350<xsl:with-param name="value" select="$allMinTime"/>351</xsl:call-template>352</td>353<td align="center">354<xsl:call-template name="display-time">355<xsl:with-param name="value" select="$allMaxTime"/>356</xsl:call-template>357</td>358</tr>359</table>360</xsl:template>361362<xsl:template name="pagelist">363<div class="group">Pages</div>364<table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%">365<tr valign="top">366<th width="50%">请求内容</th>367<th>请求数</th>368<th>异常数</th>369<th>成功率</th>370<th>平均消耗时间</th>371<th>最⼩消耗时间</th>372<th>最⼤消耗时间</th>373</tr>374<xsl:for-each select="/testResults/*[not(@lb = preceding::*/@lb)]">375<xsl:variable name="label" select="@lb"/>376<xsl:variable name="count" select="count(../*[@lb = current()/@lb])"/>377<xsl:variable name="failureCount" select="count(../*[@lb = current()/@lb][attribute::s='false'])"/> 378<xsl:variable name="successCount" select="count(../*[@lb = current()/@lb][attribute::s='true'])"/> 379<xsl:variable name="successPercent" select="$successCount div $count"/>380<xsl:variable name="totalTime" select="sum(../*[@lb = current()/@lb]/@t)"/>381<xsl:variable name="averageTime" select="$totalTime div $count"/>382<xsl:variable name="minTime">383<xsl:call-template name="min">384<xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t"/>385</xsl:call-template>386</xsl:variable>387<xsl:variable name="maxTime">388<xsl:call-template name="max">389<xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t"/>390</xsl:call-template>391</xsl:variable>392<tr valign="top">393<xsl:attribute name="class">。
jmeter教程
jmeter教程使用Jmeter进行http接口测试前言:本文主要针对http接口进行测试,使用Jmeter工具实现。
Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http 接口的测试。
一、开发接口测试案例的整体方案:?? 第一步:我们要分析出测试需求,并拿到开发提供的接口说明文档;第二步:从接口说明文档中整理出接口测试案例,里面要包括详细的入参和出参数据以及明确的格式和检查点。
??? 第三步:和开发一起对接口测试案例进行评审。
第四步:结合开发库,准备接口测试案例中的入参数据和出参数据,并整理成csv格式的文件。
第五步:结合接口测试案例文档和csv格式的数据文档,做接口测试案例的自动化案例开发。
二、接口自动化适用场景:目前设计的自动化接口测试案例有两个运行场景:1. 测试前置、开发自测:一个新的自动化接口测试案例开发完成后,直接发给接口对应的开发,安排在开发本地环境执行,一旦开发确认完成接口开发,就开始执行接口测试案例,基本上可以实时拿到测试结果,方便开发快速做出判断。
【开发本地运行的方式就是打开JMeter工具,导入JMX文件,开始执行可。
】2. 回归测试:开发本地测试通过后,或整个需求手工测试通过后,把自动化的接口测试案例做分类整理,挑选出需要纳入到回归测试中的案例,在持续集成环境重新准备测试数据,并把案例纳入到持续集成的job中来,这些用于回归的接口测试案例需要配置到持续集成平台自动运行。
三、接口测试环境准备? Jdk1.6或以上:?? Jmeter,下载址址:插件的下载安装地址:四、创建工程:1、打开Jmeter:下载好Jmeter后,双击bin目录下的jmeter.bat文件:2、添加线程组:在“测试计划”上点击鼠标右键-->添加-->threads(Users)-->线程组,添加测试场景设置组件,接口测试中一般设置为1个“线程数”,根据测试数据的个数设定“循环次数”。
基于jmeter的自动化接口测试框架
接口测试介绍
常用的接口数据传递方式
•GET •POST •PUT •DELETE
接口自动化框架设计思路
自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。简单来说,就是用程序来
测试程序。
自动化测试框架
自动化测试框架设计原则
接口自动化框架设计思路
与手工测试的区别 a) 更快速 b) 可重复 c) 可编程 d) 便于重现软件缺陷,安全可靠 e) 资源利用率高,可于周末或晚上执行
Windows批处理文件编写
设计需求: 1. 执行vbs 2. 定时运行
设计时注意事项: ① 最好做一个查询任务名然后删除的操作,防止因为有同名任务而导致批处理不执行 ② 批处理文件执行时需要使用管理员权限
Windows批处理文件编写
批处理文件内容解析
总结
➢自动化测试是一个长期的过程,在实施过程中要不断根据实际情况进行扩展与维护更新。 ➢接口测试由于没有界面,只对返回进行验证,实施自动化较web自动化测试与移动自动化 测试更为容易。 ➢自动化测试人员最好有一定的代码编写能力与环境部署能力
VBS脚本编写
脚本内容解析
Windows批处理文件编写
批处理简单介绍: 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,
通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展 名为bat 。 批处理简单示例:
start calc pause
具备多处调用的值可适当参数化,接口中调用参数方式为${参数名}
Jmeter上多接口测试脚本编写
照以上步骤逐个编写接口测试脚本 ,编写完成,测试通过,Congratulations!
jmeter接口自动化-通过csv文件读取用例并执行测试
jmeter接⼝⾃动化-通过csv⽂件读取⽤例并执⾏测试最近在公司测试中经常使⽤jmeter这个⼯具进⾏接⼝⾃动化,简单记录下~⼀、在csv⽂件中编写好⽤例⾸先在csv⽂件⾸⾏填写相关参数(可根据具体情况⽽定)并编写测试⽤例。
脚本可通过优先级参数控制执⾏哪些接⼝,通过端⼝参数同时执⾏不同端⼝下的接⼝,若想执⾏不同ip下的接⼝,也可多添加⼀个ip参数,再读取csv⽂件时进⾏参数化。
⼆、设计测试脚本并执⾏测试1、添加⼀个线程组右键测试计划 >> Threads(users) >> 线程组,点击保存即可。
2、添加HTTP 请求默认值点击线程组,右键-添加-配置元件-HTTP 请求默认值。
3、添加结果监听器结果监听组件⽤户查看接⼝测试测试结果,常⽤的聚合报告和察看结果树。
点击线程组-添加 - 监听器 - 聚合报告或者察看结果树。
4、添加循环控制器读取csv⽂件中的测试⽤例数据4.1、线程组下新增循环控制器,循环次数设置为永远。
4.2、循环控制器下新增CSV Data Set ConFig控件4.3、添加如果控制器,来做⽤例优先级的筛选执⾏⽤例4.4、根据调⽤⽅法选择请求⽅式通过if选择器区分GET与POST⽅法的请求,配置http请求POST请求的配置⽅式:POST请求参数放在body data中GET请求的配置⽅式:GET请求的参数配置url后⾯4.5、配置响应断⾔验证接⼝实际结果是否与⽤例中的预期结果⼀⼀致,可配置响应断⾔以及断⾔结果进⾏验证及查看。
5、执⾏测试并查看结果执⾏脚本后,可通过查察结果树控件查看测试结果详情,绿⾊为通过,红⾊为不通过。
可通过响应断⾔查看预期结果,与响应数据进⾏对⽐。
三、导出脚本执⾏测试完成后可保存测试计划(测试脚本),以便后续验证回归。
以上操作,就完成jmeter接⼝(半)⾃动化~\(≧▽≦)/~啦啦啦~。
全网最全最细的jmeter接口测试教程以及接口测试流程详解
全⽹最全最细的jmeter接⼝测试教程以及接⼝测试流程详解⽬录:导读⼀、Jmeter简介⼆、Jmeter安装三、设置Jmeter语⾔为中⽂环境四、Jmeter主要元件五、Jmeter元件的作⽤域和执⾏顺序六、Jmeter进⾏接⼝测试流程七、Jmeter进⾏接⼝测试流程步骤详解⼋、Jmeter接⼝测试必定⽤到的扩展阅读九、总结⼀、Jmeter简介Jmeter是由Apache公司开发的⼀个纯Java的开源项⽬,即可以⽤于做接⼝测试也可以⽤于做性能测试。
Jmeter具备⾼移植性,可以实现跨平台运⾏。
Jmeter可以实现分布式负载。
Jmeter采⽤多线程,允许通过多个线程并发取样或通过独⽴的线程对不同的功能同时取样。
Jmeter具有较⾼扩展性。
⼆、Jmeter安装1、安装JDK,必须JDK1.7以上的版本,推荐1.8的版本3、配置Jmeter的环境变量。
(1) 新增变量:JMETER_HOME:D:\apache-jmeter-5.2.1(2) 在CLASSPATH变量的最前⾯加⼊如下变量: %JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;(3)在PATH变量的最前⾯加⼊如下变量:%JMETER_HOME%\bin;4、进⼊D:\apache-jmeter-5.2.1\bin,双击jmeter.bat,或在dos窗⼝输⼊jmeter命令打开jmeter界⾯,安装成功。
对于真正的零基础来说:安装请按如下步骤完成:windows下安装jmeter? mac下安装jmeter? So Easy那多不是事!写给jmeter⼊门的朋友!三、设置Jmeter语⾔为中⽂环境1、临时设置Jmeter菜单栏选择OptionsàChoose LanguageàChinese (Simplified)这种⽅法,重启软件后⼜变为英⽂环境了。
springboot项目组引入JMeter的实现步骤
springboot项⽬组引⼊JMeter的实现步骤⽬录⼀、前⾔⼆、springboot项⽬引⼊JMeter完成接⼝⾃动化操作⼀、前⾔看到标题的⼩伙伴肯定很好奇,springboot项⽬中⽤JMeter能⼲什么,那么我先反问你JMeter能⽤来作什么?压测;接⼝⾃动化?,如果你能猜到这两点那你对JMeter肯定是有了⼀定的认知,同样你也猜对了,⽤它来做接⼝⾃动化但是可能会有⼩伙伴会有疑问为什么不拿他来做压测,当然可能拿来做压测但是不建议在springboot项⽬中整合压测功能,毕竟压测本来就是⼀种多线程的形式⽽且极其消耗内存,spring项⽬本来就很重,所以得不偿失。
当然对于压测我⼜另⼀种⽅案,就是容器化的分布式压测,这⼀块⽅案我会再后续的⽂章分享出,接下来我们先来谈谈如何在springboot项⽬中做接⼝⾃动化吧在这篇⽂章中我详细介绍过,知道JMeter engine原理之后,是否我们可以这样做,在springboot项⽬引⼊JMeter开源组件包然后使⽤其开启engine的⽅法,⾃⼰开启engine,当然此时你的线程肯定是单线程,所以基本内存消耗很低,那么如何做?我们接着往下说⼆、springboot项⽬引⼊JMeter完成接⼝⾃动化操作⾸先导⼊JMeter对应的maven坐标<properties><jmeter.version>5.3</jmeter.version></properties><dependencies><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_http</artifactId><version>${jmeter.version}</version><exclusions><exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_functions</artifactId><version>${jmeter.version}</version></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_jdbc</artifactId><version>${jmeter.version}</version></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_tcp</artifactId><version>${jmeter.version}</version></dependency></dependencies>在介绍了StandardJMeterEngine标准的引擎类,通过创建这个对象就可以开启engine,当然事实并⾮如此简单//创建engineStandardJMeterEngine engine = new StandardJMeterEngine();//将hashTree配置注⼊engine中engine.configure(hashTree);try {//执⾏engine开始运⾏engine.runTest();} catch (JMeterEngineException e) {engine.stopTest();e.printStackTrace();}所以开启engine就这么短短的⼏步操作就⾏,但是上⾯需要HashTree对象传⼊,就是你的配置,关于HashTree的⽤法及使⽤,可以参考我写的这篇博⽂HashTree有了之后,理论上是可以运⾏了,但是实际却会报错,因为JMeter engine开启会初始化配置⽂件,也就是我们熟知的jmeter.properties配置的内容,所以你可以在springboot项⽬的resource下创建jmeter⽬录存放jmeter.properties等配置配置⽂件可以去github上去获取好了配置有了,接下来我们需要先初始化jmeter.properties配置属性然后在开启jmeter engine就⾏//初始化jmeter属性配置private void initJMeterProperties() {if (!StringUtils.isEmpty(JMeterUtils.getJMeterProperties())){return;}try {InputStream inputStream = JMeterUtil.class.getResource("/jmeter/jmeter.properties").openStream();File tempFile = FileUtil.createTempFile(null);FileUtil.writeFromStream(inputStream,tempFile);//这⾥⾯loadJMeterProperties⽅法必须写成临时⽂件这样的形式,否则会获取不到jmeter.propertiesJMeterUtils.loadJMeterProperties(tempFile.getAbsolutePath());JMeterUtils.setJMeterHome(JMeterUtil.PATH);JMeterUtils.setLocale(LocaleContextHolder.getLocale());} catch (IOException e) {e.printStackTrace();}}在上⾯代码中必须通过创建临时⽂件的形式传⼊临时⽂件的路径,否则springboot打成jar⽆法找到路径从⽽报错在执⾏步骤2即可,但是会有⼀个问题engine.runTest()是⼀个空⽅法,那你如何接收运⾏的结果集数据呢?这⾥就要牵扯到的作⽤了,JMeter后端监听器作⽤及原理可以参考这篇⽂章后端监听器可以异步的接收jmeter engine运⾏的结果集,所以我们可以通过这个⽅式实现⼀个完整的接⼝⾃动化流程这是关于我的springboot项⽬采⽤后端监听器的实现⽅式public class CustomBackendListenerClient extends AbstractBackendListenerClient {private final List<SampleResult> queue = new ArrayList<>();//获得控制台内容。
一种基于JMeter的接口自动化测试方法
一种基于JMeter的接口自动化测试方法
王如迅;郭冬梅
【期刊名称】《中国金融电脑》
【年(卷),期】2024()5
【摘要】JMeter作为一款著名的软件测试工具,在DevOps模式下有着广泛的应用。
本文重点介绍现有技术方案存在的问题,提出了一种基于JMeter的接口自动化测试方法,提供标准的脚本框架并进行了技术实践。
【总页数】3页(P83-85)
【作者】王如迅;郭冬梅
【作者单位】中国国际金融股份有限公司信息技术部
【正文语种】中文
【中图分类】TP3
【相关文献】
1.一种基于 SWIG 的接口自动化测试方法
2.基于Jmeter开展接口自动化测试方法探索与实践
3.基于JMeter、Ant和WeTest的佣金管理系统接口自动化测试程序开发
4.盐酸米诺环素软膏联合甲硝唑药膜治疗牙周病的临床疗效分析
5.Discussion on Optimization and Application of Coal Mine Outburst Prevention Drilling Construction Technology
因版权原因,仅展示原文概要,查看原文内容请购买。
Jmeter接口层性能与自动化测试全程实战(小强测试)课件PPT模板
03 1-3自动化测试认 04 1-4jmeter 介绍与
知浅谈
安装
05 1-5jmeter 插件安 06 1-6接口定义和
装与管理
http请求响应
第1章接口测试和jmeter基础知识
1-7接口测试文档 1-8jmeter常用组件和概念介绍
02 第2章常见接口测试实 战
第2章常见接 口测试实战
01 2-1关于实战使用 02 2-2http 接口测试
的接口说明
实战
03 2-3请求头信息头 04 2-4响应断言和
管理器
jsonassertion
05 2-5断言持续时间 06 2-6参数化
和sizeassertion
第2章常见接口测试实战
2-7关联和请求依赖之 boundaryextractor
jmeter接口层性能与自动化测 试全程实战(小强测试)
演讲人
2 0 2 x - 11 - 11
目录
01. 第1章接口测试和jmeter基础知识 02. 第2章常见接口测试实战
01 第1章接口测试和 jmeter基础知识
1 jmeter
第 章 接 基口 础测 知试 识和
01 1-1课程介绍-必看 02 1-2性能测试认知
2-9jmeter对 cookies的自动管
理
211xpathassertiosonextractor
C 2-10webservice 接口测试实战
E 212xpathextracto r
B
D
F
感谢聆听
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Jmeter实现接口自动化设计说明
一、变量定义规则
1、全局变量:各个项目组负责人负责统一规划本项目的全局变量。
用“配置元件”中的【用户定义变量】来设置,并置顶在所有线程组的最前方。
2、HTTP消息头:各个项目组负责人负责统一规划公共的HTTP消息头。
用“配置元件”中的【HTTP信息头管理器】来设置,并放置在【用户定义变量】下方。
3、局部变量:如果每个接口中涉及到日期等局部变量,则由接口设计人员自行定义。
用“前置处理器”中的【用户参数】来设置,放在该接口请求消息之前。
4、变量的定义规则建议为:全局变量所有字母大写且名称同接口参数定义,同时在描述中说明清楚该变量含义;局部变量所有单词首字母大写且名称同接口参数定义。
5、变量引用的规则为:直接${变量名}引用。
eg:${UID},${ACCOUNT}
二、用例分组及名称定义
1、以APP端模拟的实际操作为一个线程组。
此操作可以由多个接口组成。
针对每个接口进行用例设计。
2、每个接口用“逻辑控制器”中的【简单控制器】来汇总每个接口的测试用例设计。
且建议每个【简单控制器】的命名即为需要测试的英文接口名称。
3、每个接口下面的测试用例,建议在接口名称的基础上,加上需要检查的重点字段来命名。
eg:接口名_参数=值。
如果为app类的接口,建议覆盖主要的重点参数检查。
4、注意如果是右击保存用例的时候需要从根节点处点击保存,即从【测试计划】处保存。
如果选中单个【线程组】点击保存时,此时保存的是该线程组的用例。
如果出现此情况时,可以使用右击合并的功能,将单个线程组合并到整个测试计划中去。
5、用例目录结构截图参考如下:
三、用例检查点设置
1、主要用jmeter的“断言”中的【响应断言】来判断用例的执行结果。
一般参与响应文本中的包含模式,通过判断响应消息中是否包含预期的部分重点字段来判断这条用例的执行结果是否正确错误。
响应断言中可以截取多个响应消息字段。
2、因为目前暂未想到完整的校验所有的响应消息,故jmeter的实现接口自动化,与华为的autospace的自动化工具有一定的差距。
但从后台接口的基本功能验证的角度来看是可以满足当前使用的。
3、【响应断言】设置截图参考如下:
四、批量用例执行结果检查设置
1、在jmeter图形界面中,所有用例的执行可以通过“监听器”中的【察看结果树】来汇总每个接口的测试用例的执行结果。
同时可以设置将执行的结果保存到指定的目录上。
2、因为结合ANT批量执行jmx脚本生成报告的需要,Jmeter的每个接口的测试用例不能通过【事务控制器】来汇总形成有目录层次的执行结果。
故使用了【简单控制器】汇总了每个用例的目录结构,在jmeter图形界面的查看执行结果中,如果有很多条接口测试用例的话,则建议只显示错误的执行结果。
这样方便查看。
3、多人编写接口测试用例时,建议每个人将用例执行结果写入到自己定义的csv文件中。
这样后续ant调用不同脚本时,可以生成不同的执行结果,能够区分不同的人设计的用例批量执行结果的情况。
方便用例定位和绩效评价。
4、设置写入csv文件时,建议把所有的结果配置项目都勾上,方便后期的用例执行失败后的定位分析。
注意:【Save As XML】不要勾选,如果勾选上了,保持的日志结果就不是excel 的形式了,是XML形式了。
而【Save Field Names(CSV)】这个需要勾选上。
这样会显示每个输出结果项的名称,方便查看excel表格。
5、如果生成的csv文件中有中文的时候,需要先用txt文件打开,然后保存为UTF-8格式的文档后,再用excel打开,这样中文字符就不会出现乱码。
6、【察看结果树】设置截图参考如下:
五、ANT脚本批量执行jmx脚本并生成html形式报告
1、下载apache-ant-1.9.4版本
2、将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制到Ant所在目录lib子目录之下,这样Ant运行时才能找到"org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"这个类
3、配置jmeter的bin目录下的jmeter.properties文件。
去掉以下2个文件的注释:
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.assertion_results=all
4、将附件中jmeter_report.xml文件放到ant的bin目录下,执行如下命令:ant -buildfilejmeter_report.xml
5、批量生成html的测试报告如下:
6、附jmeter_report.xml文件:。