文章目录

  • 1 接口测试概述
    • 1.1 什么是接口测试
    • 1.2 接口分类
    • 1.3 接口的设计风格分类
      • 1.3.1 Soap架构
      • 1.3.2 Rpc架构
      • 1.3.3 RestFul架构
      • 1.3.4 接口测试工具介绍
    • 1.4 接口测试流程
  • 2 Jmeter
    • 2.1 安装Jmeter
    • 2.2 Jmeter组件介绍
    • 2.3 Jmeter的应用
      • 2.3.1 添加线程
      • 2.3.2 添加HTTP Cookie管理器
      • 2.3.3 添加HTTP请求默认值
      • 2.3.4 添加用户定义的变量
      • 2.3.5 添加HTTP请求
      • 2.3.6 添加查看结果树
  • 3 Jmeter接口关联
    • 3.1 正则表达式提取器
      • 3.1.1 添加线程组
      • 3.1.2 添加HTTP请求默认值
      • 3.1.3 添加HTTP请求
      • 3.1.4 添加调试取样器
      • 3.1.5 添加查看结果树
      • 3.1.6 添加正则表达式提取器
      • 3.1.7 添加用户定义的变量
    • 3.2 Jsonpath提取器
      • 3.2.1 查看结果树的结果
      • 3.2.2 新建JSON提取器
      • 3.2.3 填写JSON提取器内容
  • 4 生成数据
    • 4.1 生成随机数方法
    • 4.2 生成随机字符串方法
  • 5 Jmeter断言
  • 6 Jmeter调试
  • 7 使用Jmeter录制和创建脚本
    • 7.1 新建线程组
    • 7.2 添加HTTP代理服务器
    • 7.3 填写HTTP代理服务器
    • 7.4 为LAN使用代理服务器
    • 7.5 查看测试结果
    • 7.6 恢复网络
  • 8 Jmeter操作数据库
    • 8.1 JDBC Connection Configuration
      • 8.1.1 添加JDBC Connection Configuration
      • 8.1.2 填写JDBC Connection Configuration
      • 8.1.3 mysql信息
    • 8.2 JDBC Request
      • 8.2.1 添加JDBC Request
      • 8.2.2 填写JDBC Request
    • 8.3 使用BeanShell取样器
    • 8.4 查看结果
      • 8.4.1 查看结果树
      • 8.4.2 日志文件
  • 9 Jmeter非GUI命令
    • 9.1 生成log文件
    • 9.2 生成jtl文件
    • 9.3 生成html文件
  • 10 持续集成测试
    • 10.1 安装Ant
    • 10.2 新建文件
      • 10.2.1 `build.xml`
      • 10.2.2 新建`jmeter-results-shanhe-me.xsl`
    • 10.3 修改`jmeter.properties`文件
    • 10.4 在命令提示符运行ant
  • 小结

1 接口测试概述

接口测试概述包括接口测试的定义,接口测试的分类,接口的设计分类。

1.1 什么是接口测试

接口测试是测试系统和系统之间、模块和模块之间、组件和组件之间的数据交互和权限鉴定。

1.2 接口分类

内部:开发的接口给内部系统使用,一般只需要正向测试用例。
外部:第一种是被测项目调用外部接口,一般只需要正向测试用例。第二种是被测项目提供接口给外部使用,一般需要正向测试用例,反向测试用例,鉴权,考虑兼容性。
测试的重点:接口功能正确性,参数的正确性,异常的处理能力,鉴权,兼容性

1.3 接口的设计风格分类

1.3.1 Soap架构

基于webservice协议,接口地址为:https://...............?wsdl

1.3.2 Rpc架构

基于dubbo(thrift)协议的接口,接口地址为:dubbo://......,如:springcloud微服务

1.3.3 RestFul架构

基于http协议。
http协议是一种超文本传输协议,是客户端和服务器交互数据的协议。分为请求和响应两个部分。

(1)请求包含请求行(请求方式和请求路径),请求头,请求报文。
请求方式有get,post,put和delete。
请求路径为url。
请求头有5种。
Accept。指定客户端接收的数据格式。
X-Request-with。异步请求。
User-Agent。客户端的类型。
Content-Type。客户端发送的数据的类型。
Cookie。服务器返回给客户端并且保存的Cookie信息。

(2)响应包含响应行(响应码和响应信息),响应头,响应报文。

1.3.4 接口测试工具介绍

第一套体系:jmeter+ant+git+jenkins 常用
第二套体系:postman+newman+git+jenkins

1.4 接口测试流程

第一,拿到接口文档(抓包,录制),熟悉接口业务,接口地址,鉴权,入参,出参,错误码,兼容。
第二,接口测试用例的设计和评审。
正例。
反例。鉴权反例(必填,错误,鉴权码过期……);参数反例(必填,参数类型异常,参数长度异常);兼容性(一个接口对应多个版本App)
第三,执行接口测试用例。
第四,持续集成并生成报告。

2 Jmeter

JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。

2.1 安装Jmeter

点击链接跳转Jmeter安装教程!!
Jmeter5.5文件目录如下图:

backups。备份目录,jmx脚本。自动地保存你的接口项目。
bin。存放jmeter的启动脚本。配置文件,模块文件。其中jmeter.bat,是启动文件。jmeter.propties,是全局配置文件。
docs。离线帮助文档。
extras。存放和构建第三方集成文件。比如:Ant,build.xml。
lib。库文件,jar包。
printable_docs。用户手册。

2.2 Jmeter组件介绍

测试计划。jmeter的起点和容器。
线程组。代表虚拟用户。
取样器。发送请求的最小单元。
逻辑控制器。控制组件的执行顺序。
前置处理器。在请求之前的操作。
后置处理器。在请求之后的操作。
断言。判断请求是否成功。
定时器。是否延迟或间隔发送请求。
配置元件。请求的配置信息。
监听器。负责收集测试结果。

执行顺序如下:
测试计划->线程组->配置原件->前置处理器->定时器->取样器->后置处理器 ->断言->监听器

作用域
组件会作用于它的父级组件,同级组件以及同级组件的子组件。

2.3 Jmeter的应用

2.3.1 添加线程

选中测试计划,右键,添加,线程(用户),线程组,如下图所示:

重命名线程组,为线程组2,如下图所示:

ctrl+S,保存到电脑中任意的目录下,我这里直接保存在桌面,如下图所示:

2.3.2 添加HTTP Cookie管理器

选中线程组2,右键,添加,配置元件,HTTP Cookie管理器,如下图所示:

即成功添加HTTP Cookie管理器,一般不管有没有Cookie,都要添加HTTP Cookie管理器,以备不时之需。

Cookie鉴权的原理
客户端第一次访问服务器,服务器就会生成Cookie,然后通过响应头里的Set-Cookie传输到客户端,然后保存在客户端中。
第2-N次访问服务器时,在请求头里面通过Cookie把保存在本地的Cookie信息传输到服务器实现鉴权。

2.3.3 添加HTTP请求默认值

选中线程组2,右键,添加,配置元件,HTTP请求默认值,如下图所示:

在HTTP请求默认值中添加协议https,ip,端口号443,如下图所示:

2.3.4 添加用户定义的变量

选中线程组2,右键,添加,配置元件,用户定义的变量,如下图所示:

一般存放全局变量,调用全局变量格式如下:

${gobal_variate}

2.3.5 添加HTTP请求

选中线程组2,右键,添加,取样器,HTTP请求,如下图所示:

在HTTP请求中,修改名称,填写HTTP请求方式、路径、内容编码和参数,如下图所示:

2.3.6 添加查看结果树

选中线程组2,右键,添加,监听器,查看结果数树,如下图所示:
回到HTTP 请求,translate_bass,点击运行,如下图所示:

去到查看结果树,查看取样器结果,如下图所示:

选择以json格式查看响应数据,如下图所示:

注:若出现中文乱码则修改配置文件。
第一,找到配置文件,如下图所示:

第二,在对应的行中添加,sampleresult.default.encoding=utf-8,如下图所示:

第三,重启Jmeter。

3 Jmeter接口关联

Jmeter接口关联需要正则表达式提取器或json提取器获取数据,将该数据设置为全局变量,供其他接口使用。

3.1 正则表达式提取器

正则表达式提取器一般正则规则是(.*?)

3.1.1 添加线程组

选中测试计划,添加线程组。

3.1.2 添加HTTP请求默认值

协议,IP,端口号,如下图所示:

3.1.3 添加HTTP请求

post类型,路径,参数,如下图所示:

3.1.4 添加调试取样器

为了查看access_token值,如下图所示:

3.1.5 添加查看结果树

点击运行按钮,运行结果,选中mall_cms_v2请求,如下图所示:

在Regular expression框输入"token":"(.*?)",点击【Test】按钮,运行结果,如下图所示:

出现了两个token值。

选中调试取样器,如下图所示:

在Regular expression框输入"token":"(.*?)",点击【Test】按钮,运行结果,如下图所示:

出现了两个token值。

3.1.6 添加正则表达式提取器

选中mall_cms_v2,添加,后置处理器,正则表达式提取器,如下图所示:

填写引用名为token,即自定义的变量名;正则表达式"token":"(.*?)";模板为$1$,即表示匹配第一个正则;匹配数字为1,即取第一个token值,0随机取token值,-1表示取所有的token值,缺省值为default,即默认值,如下图所示:

3.1.7 添加用户定义的变量

将access_token设置为全局变量,如下图所示:

方便其他接口调用。

3.2 Jsonpath提取器

3.2.1 查看结果树的结果

以JSON PAthe Tester输入结果,如下图所示:

提取token值,在JSON Path Expression,如下图所示:

注:提取token值方法
(1)$ 表示根目录
(2)[ ]表示列表,索引值从0开始。如:提起列表中第3个元素,即[2]。
{}表示对象,用.引用。
例如:

{[{"code":1,"name":"abc"}
]
[{"id":"001","token":"abQWEQW123123Ec"}
]
}

如果想要提取,token值,如下:

$[1].token

3.2.2 新建JSON提取器

选中mall_cms_v2 (HTTP请求),添加,后置处理器,JSON提取器,如下图所示:

3.2.3 填写JSON提取器内容

自定义的变量名为token,jsonpath表达式为$.data.token,1取得第一个匹配到的值,默认值为default,如下图所示:

4 生成数据

生成数据需要随机生成数或者是字符串。

4.1 生成随机数方法

工具,函数助手对话框,如下图所示:

选择Random,填写最小值为100000,最大值为9999999,变量名为rn,如下图所示:

点击【生成】按钮,如下图所示:

可以将${__Random(1000000,9999999,rn)}可以创造数据使用。

4.2 生成随机字符串方法

选择RandomString,填入该字符串的长度为8,该字符串由abcdefg123叶大叔组成,变量名为rn_s,如下图所示:

5 Jmeter断言

Jmeter断言常用断言有响应断言、json断言和BaseShell断言。

响应断言分为状态断言和业务断言。
状态断言一般断言状态码,如下图所示:

相等要求测试模式下的数据和实际结果的数据必须一致。

业务断言是主要的断言,如下图所示:

包括是测试模式下的数据,可以将测试模式下的数据看做预期结果。

6 Jmeter调试

Jmeter与fiddler配合使用。
下载fiddler安装包
官方下载地址,如下图所示:

https://www.telerik.com/fiddler

需要填写邮箱。
安装成功,如下图所示:

首先,在Jmeter中的HTTP请求添加代理服务器的IP地址和端口号,即在mall_cms_v2中添加Fiddler的IP为127.0.0.1和端口号为8888,如下图所示:

然后,在Fiddler中的Fiters下,添加HTTP请求,即mall_cms_v2接口的IP地址和端口号,如下图所示:

此外,在请求之前将数据先传输到Fiddler中,再从Fiddler传到服务器中,实现此操作,需要调整规则,如下图所示:

回到Jmeter,运行mall_cms_v2,因为请求之前必须经过Fiddler,所以跳转到Fiddler,在这里可以修改name和password的值,进行调试,再运行。也可以直接直接运行,如下图所示:

运行结果,如下图所示:

最后,回到Jmeter中,查看结果树,如下图所示:

请求成功。

7 使用Jmeter录制和创建脚本

使用Jmeter自带的http代理服务器。

7.1 新建线程组

选中测试计划,添加,线程(用户),线程组,如下图所示:

7.2 添加HTTP代理服务器

选中测试计划,添加,非测试元件,HTTP代理服务器,如下图所示:

7.3 填写HTTP代理服务器

端口号为8888,目标控制器是线程组4,Type是HttpClient4,如下图所示:

点击【启动】按钮,弹出录制窗口,如下图所示:

7.4 为LAN使用代理服务器

控制面板,Internet选项,连接,局域网设置,如下图所示:

打开LAN代理服务器,输入Jmeter的地址和端口号,如下图所示:

此时,访问其他网页回弹出警告,如下图所示:

添加过滤器,过滤百度页面的请求,添加建议排除,如下图所示:

访问如下网址:

https://documenter.getpostman.com/view/12387168/TzzDKb12#61791a1f-9410-42ee-8be1-0650b3bf2e97

浏览器弹出警告,如下图所示:

7.5 查看测试结果

回到Jmeter,查看HTTP请求,将请求名称改为访问mall_cms_v2首页接口,如下图所示:

查看结果树,如下图所示:

7.6 恢复网络

关闭LAN使用代理服务器,如下图所示:

若没有关闭LAN代理,则无法正常上网。

8 Jmeter操作数据库

官网下载地址如下:

https://downloads.mysql.com/archives/c-j/

添加驱动包到jmeter的lib目录中,我的myssql是8.0.28的,所以需要mysql-connector-java-8.0.28.jar,如下图所示:

8.1 JDBC Connection Configuration

8.1.1 添加JDBC Connection Configuration

添加新的线程组,添加,配置元件,JDBC Connection Configuration,如下图所示:

8.1.2 填写JDBC Connection Configuration

数据池的名称,最大的连接数量,最长等待时间,自动连接,事务的隔离级别,不立即初始化连接池,如下图所示:

8.1.3 mysql信息

数据的url地址,JDBC的驱动,用户,密码,如下图所示:

8.2 JDBC Request

8.2.1 添加JDBC Request

选中线程组,添加,取样器,JDB Request,如下图所示:

8.2.2 填写JDBC Request

填写数据库池的名称,sql语句,查询结果存放在result变量中,如下图所示:

8.3 使用BeanShell取样器

BeanShell取样器对result变量结果进行操作。result为查询整个表的结果,get(0)获取整个表的第一行,get("name")获取name字段的值,如下:

//输出值
log.info(vars.getObject("result").get(0).get("name"));
log.info(vars.getObject("result").get(0).get("price"));
//设置为全局变量
vars.put("name1",vars.getObject("result").get(0).get("name"));
vars.put("price1",vars.getObject("result").get(0).get("price"));

详细如下图所示:

注:该字段的类型必须是字符串才能取值。

8.4 查看结果

点击运行按钮,即可查看结果。

8.4.1 查看结果树

结果运行成功,如下图所示:

8.4.2 日志文件

点击右上角,在底部即可弹出日志文件,如下图所示:

回到Navicat查看数据库数据,如下图所示:

此外,可以新建请求,验证全局变量是否设置成功,请求地址栏加入全局变量,如下图所示:

查看请求结果,去到查看结果树查看结果,如下图所示:

传值成功,全局变量设置成功。
到此,Jmeter操作数据库小例子完成。

9 Jmeter非GUI命令

Jmeter可以生成log文件、jtl文件和html文件。

9.1 生成log文件

-n 必须和-t(指定jmeter脚本)一起使用,如下图所示:

只会生成一个log日志文件,没有报告输出。

9.2 生成jtl文件

-l 生成jtl格式的报告
首先要修改配置文件
(1)在下图位置添加jmeter.save.saveservice.output_format=xml,如下图所示:

(2)在下图位置添加jmeter.save.saveservice.response_data=true,如下图所示:

(3)在下图位置添加jmeter.save.saveservice.samplerData=true,如下图所示:

在命令提示符窗口输入:jmeter -n -t test.jmx -l result.jtl,如下图所示:

生成的result.jtl需要在jmeter中读取。打开jmeter,新建线程组,添加查看结果树,将result.jtl在查看结果树打开,如下图所示:

9.3 生成html文件

-e 生成html报告,不能单独使用,与-o(输出)一起使用。
需要在jmeter.properties配置文件添加代码,在下图位置添加jmeter.save.saveservice.samplerData=true,如下图所示:

输入命令:jmeter -n -t test.jmx -l result.jtl -e -o results,如下图所示:

运行结果,如下图所示:

打开results文件下的index.html,如下图所示:

10 持续集成测试

Jmeter+Ant+Jenkins实现接口持续集成。

10.1 安装Ant

点击跳转详细安装Ant!!

10.2 新建文件

需要新建build.xmljmeter-results-shanhe-me.xsl

10.2.1 build.xml

build.xml内容,如下图所示:



分析上述截图(下面6处需要根据具体情况进行修改):

  1. 为jmeter的安装路径
  2. 为jtl存放路径
  3. 为接口测试总体报告文件路径
  4. 为运行路径
  5. 生成接口测试汇总报告的依赖文件路径。jmeter-results-report_21.xsl为Jmeter自带的,由于Jmeter版本不同,需要去Jmeter/extras目录下查看。
  6. 生成接口测试详细报告的依赖文件路径(该文件需要新建!)

build.xml文件代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<project name="ant-jmeter-test" default="run" basedir=".">
<property environment="env" />
<tstamp><format property="time" pattern="yyyy_MM_dd__mm"/></tstamp><!-- 需要调用的jmeter目录,根据需要进行修改--><property name="jmeter.home" value="D:\apache-jmeter-5.5"/><property name="report.title" value="接口测试" /><!--jmeter生成jtl格式的结果报告路径--><property name="jmeter.result.jtl.dir" value="D:\ants\jtl" /><!--jmeter生成html格式的结果报告路径--><property name="jmeter.result.html.dir" value="D:\ants\html" /><!--【详细报告】jmeter生成html格式的详细报告的路径--><property name="jmeter.result.html.dir1" value="report" /><!--生成的报告的前缀--><property name="ReportName" value="接口测试汇总报告"/><property name="ReportName1" value="接口测试详细报告"/><property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl"/><property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html"/><!--【详细报告】详细报告的文件名--><property name="jmeter.result.htmlName1" value="${jmeter.result.html.dir1}/${ReportName1}.html"/><target name="run"><!--antcall target="delete" /--><antcall target="test" /><antcall target="report" /></target><!--该命令用来删除已经执行过的jtl,防止旧数据重叠<delete file="${jmeter.result.jtl.dir}/${ReportName}${env.BULLD_ID}.jtl" /></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:\ants" 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-report_21.xsl"><param name="dateReport" expression="${report.datestamp}" /></xslt>    <!--详细报告指定详细报告模板文件--><xsltclasspathref="xslt.classpath"force="true"in="${jmeter.result.jtlName}"out="${jmeter.result.htmlName1}"style="${jmeter.home}/extras/jmeter-results-shanhe-me.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><!--【详细报告】拷贝图片到目标目录--><copy todir="${jmeter.result.html.dir1}"><fileset dir="${jmeter.home}/extras"><include name="collapse.png" /><include name="expand.png" /></fileset></copy></target>
</project>

然后,把build.xml放到与jmx同级目录中,如下图所示:

10.2.2 新建jmeter-results-shanhe-me.xsl

jmeter-results-shanhe-me.xsl文件,需要放在apache-jmeter-5.5\extras目录下,该文件是为了生成接口测试详细报告,比较美观,而且有接口测试的详细参数, jmeter-results-shanhe-me.xsl文件代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="html" indent="no" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/><xsl:strip-space elements="*"/><xsl:template match="/testResults"><html lang="en"><head><meta name="Author" content="shanhe.me"/><title>JMeter Test Results</title><style type="text/css"><![CDATA[* { margin: 0; padding: 0 }html, body { width: 100%; height: 100%; background: #b4b4b4; font-size: 12px }table { border: none; border-collapse: collapse; table-layout: fixed }td { vertical-align: baseline; font-size: 12px }#left-panel { position: absolute; left: 0; top: 0; bottom: 0; width: 300px; overflow: auto; background: #dee4ea }#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,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAICAYAAAArzdW1AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDEBQqGbO7BEcAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAKRJREFUGNN1zM0KgkAYheF3RvtXSsGyWhRNaILS7bdt11W0KgJvoPwZp0UlBPUtz3nOJw7Hk7necv5dOA2Qaazo2vZP0LEt9olCVtqQROufKNmuqBuBNAYW4QzXGX6B0bDPcjGnMQYJ8Cg12U59oSzaUJQa4IUAXMclDHwAAn/MxPMw765FZd2QRgopBWmsKCrdfhXnS/4ZYElBXdyxewN008Y8AephLAkqz613AAAAAElFTkSuQmCC) }#left-panel li.success { color: #565b60 }#left-panel li.failure { color: red }#left-panel li { list-style: none; color: black; cursor: pointer }#left-panel li.selected { background-repeat: repeat-x; color: white; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAYAAABMDlehAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDEBQxLTs5O2gAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAEdJREFUCNc1y7ERgEAMA0GNUhIyGqM2uqKgtyWZhE9v53A/7/A6D7BkMDNgy2AroB2wHTCZv5UMOgFLG1bvd7XBckBlwCXjA5wMOF5iOX/MAAAAAElFTkSuQmCC) }#left-panel div { line-height: 20px; background-position: 25px 3px; background-repeat: no-repeat; padding: 0 0 0 45px }#left-panel div.success { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDEBULEEc6wzcAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAiNJREFUKM99kktIVGEYhp/jzJl08lI6logp2Y2EFkbtaqlFROsWrlq4ioJWQRs37VoUVItWkYEVRGSBlhleCpywDEWxTEuxcURTZ6YzxzP/5WshCOHUt36f93kXnyMi5Lsnb4clI4s4fhkXzp5w8mWcfHBvfEpUxVdCUUU6lUPNHuD86cYtBQX5GhPrM7hRg7GaSDRg2vuUd90WuOPVsOyqy6FFo2yOQHlU1S9z9dZT+S/8I7GCLlkAN4eyAf56mnT6Fy1HLnGuuYa++MS/4e74qMRqfXLaJ9BpfnsrLC0m2BYuoqwUbj/+274JD43OEqmexwvW8NUKXnaZtVSS1pNtAAyOvyC6v48HnUNb4Z7PH8UtTlIQWA5tb2RhYY7kz3l2FleytJYg/qWb8t2KZ/0PN+1hgI6uEUr2jpHKpGlquExVaS0VbjUZL7WxaqIXK6ADQ0n9GNfv9XCttWnD/O57t0TKFklnF3g5fJ/seoaa2D4O1x0F4PlgO9oIftbgFgYMfLgjACGqj0vlsddoUnj+Kt/mxunq72RP+UGqYjWMTA7R+b6dUCSEGEF5hoJQip6BaFs4HJtCyRrKs6wHCovDip/kys0WWpovMpOYBCtoT2N9B5uzWG0Zid8gnFrVFEQDtBaUrxEgXBimaEeER2/uIiK4roPOaMRYjBKsFly3fOO3G06dETGCWIsYjckprMphtEKMAQtgsMYi1mJMQHJ6xvkDKQoyphCzkl0AAAAASUVORK5CYII=) }#left-panel div.failure { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDEBUJOEC5CU8AAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAeVJREFUKM+NkDtok2EUhp8vl9ZLo/EyKI6KFgqCKC4OClrBWUQEcRRx1cGpk3WyInWrgoMZKkW8thYaEYQ0i7WC2ngrNDTERHJvkv/L/3//dxwc7F8jeOAsh/c973OOEhG61aPnaen7maXYt4MLZ4+pbppQt+F06jNH3QWOb8pxUs+SmJzjv83hxY8SVy3wNdtVneiHqe54IhLoB4/TUkyMyOrKj5yXoVtPZK02kLyYK7OnlqFWzgcCGtUC/YUJ3n5a/jd28tU7ORTN0myUA6Jms8bpWIa798elqzn1fokjThrpVBC3ETzNbYAuca59j/Hp+b/N869Tsk8tgVMCXQk+RlfQuk1/tMLMwzsSMCcm5zjhvoR2AdpF0GuwO4aqttS05ZSbZHhsBoAIwI83Cdkd/460XDAOG02d24MxvlR8dsUUh3f2UHaEtgdbWCHz4oZwcVCp66PP5FLhKjEc8DXaCMsNy8DYn/SnZ+L0hhWOb/F8yLs9fDtwk8j+VpqwrlC34PrgGEu2bhlYhZ1b8dncq3AMeBaUr/k6NUyk4ChKzu+N2hc6Bqody+WDG8g2fLatD7F3axjPgmvAtYJvIbouhhIRrl0ZktnkBGIt1gqeMXQ8D2MMiCIUCqFEsFhEQMSykCuqX0MzLAUJTzRsAAAAAElFTkSuQmCC) }#left-panel div.detail { display: none }#right-panel { position: absolute; right: 0; top: 0; bottom: 0; left: 301px; overflow: auto; background: white }#right-panel .group { font-size: 12px; font-weight: bold; line-height: 16px; padding: 0 0 0 18px; counter-reset: assertion; background-repeat: repeat-x; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAQCAYAAADXnxW3AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDEBUkDq8pxjkAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAADdJREFUCNdVxrERwDAMAzGK0v47eS6Z927SpMFBAAbkvSvnRk5+7K5cVfLMyN39bWakJAjA5xw9R94jN3tVhVEAAAAASUVORK5CYII=) }#right-panel .zebra { background-repeat: repeat; padding: 0 0 0 18px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAmCAYAAAAFvPEHAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sDEBYWFlNztEcAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAABdJREFUCNdjYKAtePv5338mBgYGBpoQAGy1BAJlb/y6AAAAAElFTkSuQmCC) }#right-panel .data { line-height: 19px; white-space: nowrap }#right-panel pre.data { white-space: pre }#right-panel tbody.failure { color: red }#right-panel td.key { min-width: 108px }#right-panel td.delimiter { min-width: 18px }#right-panel td.assertion:before { counter-increment: assertion; content: counter(assertion) ". " }#right-panel td.assertion { color: black }#right-panel .trail { border-top: 1px solid #b4b4b4 }]]></style><script type="text/javascript"><![CDATA[var onclick_li = (function() {var last_selected = null;return function(li) {if( last_selected == li )return;if( last_selected )last_selected.className = "";last_selected = li;last_selected.className = "selected";document.getElementById("right-panel").innerHTML = last_selected.firstChild.nextSibling.innerHTML;return false;};})();var patch_timestamp = function() {var spans = document.getElementsByTagName("span");var len = spans.length;for( var i = 0; i < len; ++i ) {var span = spans[i];if( "patch_timestamp" == span.className )span.innerHTML = new Date( parseInt( span.innerHTML ) );}};var patch_navigation_class = (function() {var set_class = function(el, flag) {if(el) {el.className += flag ? " success" : " failure";}};var traverse = function(el, group_el, flag) {while(1) {if(el) {if(el.className == 'navigation') {set_class(group_el, flag);group_el = el;flag = true;} else {var o = el.firstChild;o = o ? o.className : null;flag = flag ? (o == 'success') : false;}el = el.nextSibling;} else {set_class(group_el, flag);break;}}};return function() {var o = document.getElementById("result-list");o = o ? o.firstChild : null;if(o)traverse(o, null, true);};})();window.onload = function() {patch_timestamp();patch_navigation_class();var o = document.getElementById("result-list");o = o ? o.firstChild : null;o = o ? o.nextSibling : null;if(o)onclick_li(o);};]]></script></head><body><div id="left-panel"><ol id="result-list"><xsl:for-each select="*"><!-- group with the previous sibling --><xsl:if test="position() = 1 or @tn != preceding-sibling::*[1]/@tn"><li class="navigation">Thread: <xsl:value-of select="@tn"/></li></xsl:if><li onclick="return onclick_li(this);"><div><xsl:attribute name="class"><xsl:choose><xsl:when test="@s = 'true'">success</xsl:when><xsl:otherwise>failure</xsl:otherwise></xsl:choose></xsl:attribute><xsl:value-of select="@lb"/></div><div class="detail"><div class="group">Sampler</div><div class="zebra"><table><tr><td class="data key">Thread Name</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@tn"/></td></tr><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><tr><td class="data key">Time</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@t"/> ms</td></tr><tr><td class="data key">Latency</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@lt"/> ms</td></tr><tr><td class="data key">Bytes</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@by"/></td></tr><tr><td class="data key">Sample Count</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@sc"/></td></tr><tr><td class="data key">Error Count</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@ec"/></td></tr><tr><td class="data key">Response Code</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@rc"/></td></tr><tr><td class="data key">Response Message</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="@rm"/></td></tr></table></div><div class="trail"></div><xsl:if test="count(assertionResult) &gt; 0"><div class="group">Assertion</div><div class="zebra"><table><xsl:for-each select="assertionResult"><tbody><xsl:attribute name="class"><xsl:choose><xsl:when test="failure = 'true'">failure</xsl:when><xsl:when test="error = 'true'">failure</xsl:when></xsl:choose></xsl:attribute><tr><td class="data assertion" colspan="3"><xsl:value-of select="name"/></td></tr><tr><td class="data key">Failure</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="failure"/></td></tr><tr><td class="data key">Error</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="error"/></td></tr><tr><td class="data key">Failure Message</td><td class="data delimiter">:</td><td class="data"><xsl:value-of select="failureMessage"/></td></tr></tbody></xsl:for-each></table></div><div class="trail"></div></xsl:if><div class="group">Request</div><div class="zebra"><table><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="java.net.URL"/></pre></td></tr><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><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><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></table></div><div class="trail"></div><div class="group">Response</div><div class="zebra"><table><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><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><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></table></div><div class="trail"></div></div></li></xsl:for-each></ol></div><div id="right-panel"></div></body></html></xsl:template>
</xsl:stylesheet>

10.3 修改jmeter.properties文件

格式为xml,如下图所示:

都改为true,如下图所示:

10.4 在命令提示符运行ant

运行之前需要将Jmeter的文件extras目录的ant-jmeter-1.1.1.jar文件拷贝到ant安装目录的lib文件夹中,如下图所示:

在命令提示符找到ants路径,输入ant,运行成功,如下图所示:

生成文件目录,如下图所示:

找到接口测试汇总报告,在html目录下,如下图所示:

打开接口测试汇总报告,如下图所示:

找到接口测试详细报告,在report目录下,如下图所示:

打开接口测试详细报告,如下图所示:

小结

Jmeter组件有测试计划、线程组、配置原件、前置处理器、定时器、取样器、后置处理器 、断言和监听器。
接口关联使用正则表达式提取器或json提取器获取数据,将数据设置为全局变量,供其他接口使用。
使用Jmeter中的函数助手对话框,可以生成随机数据和随机字符串。
Jmeter调试和Fiddler抓包工具使用。在HTTP请求中的高级模块,添加Fiddler的IP地址127.0.0.1。端口号为8888。
Jmeter操作数据库通过JDBC Connection Configuration、JDBC Request、BeanShell取样器和查看结果树。
JDBC Connection Configuration创建与数据库的连接,JDBC Request请求与数据连接,BeanShell取样器提取查询结果,查看结果树查看查询的结果。
Jmeter可以生成log文件、jtl文件和html文件。
持续集成测试由Jmeter和Ant实现。
build.xml配置尤其关键。需要和jmeter-results-report_21.xsl配合使用。
Jmeter需要进阶的内容加密(MD5,RSA,BASE64,SHA1,自定义加密等等),签名,beanshell和java语言。
自动化最核心就是搭建自动化测试框架,最终只需要在项目里写测试用例即可。
自动框架:python+pytest+yaml用例+logging+jenkins+数据驱动+allure报告

软件测试 接口测试 入门Jmeter 接口关联 提取器 断言 与fiddler配合使用 使Jmeter录制和创建脚本 操作数据库 持续集成测试相关推荐

  1. Jmeter之正则表达式提取器(一)

    Jmeter之正则表达式提取器 前言 接口间的关联参数数据需要传递参数值.故可通过 正则表达式提取器 来处理. 下面我们一起来学习如何使用 正则表达式提取器 获取接口返回的值 正则表达式提取器的使用 ...

  2. 性能测试之JMeter接口关联【JSON提取器】详解

    1.JSON提取器介绍 相信做过自动化测试的朋友经常会遇到这样的场景:我想调用系统中的某个业务接口,但是需要先登录系统.也就是现在很多接口的访问,都是需要登录接口的token做为基础. 在JMeter ...

  3. Jmeter之JSON提取器说明示例

    目录 前言 一.获取某一个字段 二.获取相同字段的多个值 三.提取多个字段 前言 在接口测试的时候,通常会遇到上一个接口的响应数据在下一个接口需要使用,那么这里就可以使用JSON 提取器来进行关联. ...

  4. jmeter的json提取器和json提取器取值

    前言: 本人觉得,json提取器比正则提取器的使用场景更多,大部分接口返回值其实是可以通过json提取器取值.正则表达式比我来说易用性不强,推荐直接学json提取器干活 思路: 1.试试怎么提取要取的 ...

  5. 软件测试--接口测试入门

    一.什么是接口测试 接口测试顾名思义就是对测试系统组件间接口的一种测试,接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统 ...

  6. JMeter接口测试___接口关联

    前言 一.什么是接口关联? 二.JMeter关联方法: 1.正则表达式提取器 2.Json Extractor提取器 3.边界值提取器 总结 前言 关联的概念: 关联也称为串行参数或数据依赖.    ...

  7. jmeter正则表达式提取器

    jmeter正则表达式提取器 我们在使用jmeter做接口测试时,常常会碰到上个接口的返回值会作为下个接口的参数来进行请求.这时候,就需要用到jmeter的正则表达式提取器了 1.新建正则表达式提取器 ...

  8. jmeter正则表达式提取器的用法和正则

    我们再使用jmeter请求接口时,碰到一些业务流程性的接口改怎么办,比如,我一个发布内容的接口需要用到登录接口返回的token加到请求上去才能发布内容,那在jmeter上该是如何实现的咧? 这里介绍的 ...

  9. JMeter-正则表达式提取器的Apply to 详解

    前言1:阅读量,作为本人无数次调接口,阅读量就增加了,记录的是[人次],不是具体的[人]. 前言2:JMeter中正则表达式提取器的Apply to 模块下的详解 apply to作用范围 1.Mai ...

  10. Python即时网络爬虫项目: 内容提取器的定义(Python2.7版本)

    1. 项目背景 在Python即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间太多了(见上图),从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端 ...

最新文章

  1. [Win7]如何还原[.bat]文件关联
  2. 一系列图论问题[转]
  3. python京东注册账号_Python爬虫模拟登录京东获取个人信息
  4. python和perl_Python与Perl的DBI是什么等价物?
  5. Window捕获消息机制及动态创建button-MFC
  6. MySQL 无法连接
  7. C#净化版WebApi框架
  8. BZOJ1566 [NOI2009]管道取珠 【dp】
  9. gimp中文版教程_GIMP中文教程.pdf
  10. 2017华为笔试题3
  11. 机电大作业(第一阶段)
  12. 带你开发一款给Apk中自动注入代码工具icodetools(完善篇)
  13. 学习单片机,通常要学哪些知识点?(附送75块带屏开发板)
  14. VC 获取任务栏窗口的句柄
  15. SQL in 模糊查询的问题
  16. 如何用光盘映像文件重装服务器系统,光盘映像文件如何装系统_通过光盘映像文件装系统的方法...
  17. 网管技巧:如何修改路由器和交换机的密码
  18. 云测平台iOS环境搭建
  19. 神经网络的图谱是什么,图神经网络和神经网络
  20. 悟空分词与mysql结合_中文分词与关键词提取实践小结

热门文章

  1. QT递归获取指定目录下的所有文件
  2. mysql 建表结构_MySQL学习系列之二——创建表及对表结构的基本操作
  3. 教新人如何压制AVI和RMVB(教程及下载)
  4. 微信小程序开发手机商城部分代码(不包括支付功能)
  5. 百度编辑器 UEditor 使用方法 及 如何设置固定高度且带滚动条及 如何设置修改传值的 name 属性
  6. linux vim -b详解,linux vim
  7. SQL的导入excel数据
  8. win10自带抓包工具_win10应用商店抓包-Win10商店抓包工具下载 v1.1免费版--pc6下载站...
  9. 写一彩票程序,要求能随机产生并按照升序输出1-30之间的7个数,且其中任意两个数字不能重复
  10. 微信小程序开发(后端 Java)