-
2021-07-14 00:52:00
前言:
最近看了很多写的非常好的接口文档,在理解业务方面给了非常多的帮助,解决很多时候对于一些
协商数据
的问题困扰,同时,后续个人的工作当中,也需要对外开放接口给第三方进行调用,这时候一个好的规范文档可以解决很多问题。文章目的:
- 个人对于写接口文档的一些资料整理。
- 学习如何写一份别人乐意去看的文档。
- 希望可以通过本文帮助处理那些面临自己写接口文档的情况下无从下手的尴尬的局面。
目录:
主要分为以下两个版本,两个版本各有各自的特点,需要应对不同的应用场景
- 简单版本
- 复杂版本
简单版本
核心:如果你的案例可以直接依靠复制拿来使用,那这个文档就是好文档
既然要简单,那就抓住核心:怎么简单怎么来,怎么省时间怎么来
如果不知道怎么写,就把案例写的越详细越好。
开发时间是非常宝贵的,而接口对接通常都是一些工期紧张的情况下去快速编写,而且面对一些碎片化的时间工作者,一份简单直观的文档可能更受欢迎。
另外,接口文档最终形式最好是pdf,以前遇到过接口文档写到word里面的,在不同的版本下可能会出现样式等各种问题
最佳方式:word -> pdf
简单版本的目录格式
- 接口说明
- 请求示例
- 请求参数说明
- 响应示例
- 响应参数说明
案例模板1:
接口说明:
接口功能:
本接口用于获取用户的token信息。
接口请求地址:
https: xxx/xxx/xxxx
请求头 :
请求头 请求内容 说明 Authorization Basic secretKey 访问token Content-Type application/json 请求方式 请求方式: POST
参数类型 :JSON
请求示例:
绝大多数为json,格式自定
[ {"id":"20201219", "name":"21.59", "age":"ftp_1002" ... }, {"id":"20201219", "name":"21.59", "age":"ftp_1002" ... }, ]
请求参数说明
字段名 字段说明 字段类型 是否必填 字段1 说明字段1的作用 varchar(50) 是 字段2 说明字段2的作用 int 是 字段3 说明字段3的作用 decimal 是 响应示例
成功响应编码:
{ "code: "200", "message": "请求成功", "data": 返回数据,格式自定 }
失败响应编码:
{ "code: "200", "message": "请求成功", "data": 返回数据,格式自定 }
响应参数说明
接口返回码 接口返回描述 200 成功 400 请求参数异常 401 授权失败 500 系统异常 案例模板2:
下面这种模板是单个接口的适合很实用,同时针对一些比较简单的接口这样处理还算比较直观
核心是一个表包含所有信息,这对于一些接口量非常非常大的时候或者接口参数相似的时候比较有效果,这样可以使得内容比较紧凑,不会看了下一页忘记上一页的烦恼,当然缺点也很明显,会存在文字堆积的情况。
markdown的表格在存放Json的数据时候不是很直观,建议使用 word
接口名 UserUpdateService 接口请求地址 http://www.baidu.com 功能说明 UserUpdateService接口是应用系统的账号修改方法 请求参数 参数名 中文说明 RequestId 平台每次调用生成的随机ID,应用系统每次响应返回此ID,String类型 uid 三方应用系统账号创建时,返回给应用系统的账号主键uid。必传字段 loginName/ fullName 需要修改的账号字段属性 响应参数 参数名 中文说明 RequestId 平台每次调用接口发送的请求ID,字段为String类型 resultCode 接口调用处理的结果码,0为正常处理,其它值由应用系统定义。字段为String类型,必传字段。 message 接口调用处理的信息。字段为String类型 请求示例: { “token”,””, “treeCode”,” EXECUTIVE”, “code”,””} markdown展示不是很好看,建议word 返回值 { "xxxx": "xxxxxx", "resultCode": "0", "message": "success" } markdown展示不是很好看,建议word 案例模板3:
下面这种可能不是很直观,但是参考很多文档发现好像类似的还不少,也可以参考一下。
请求地址:
http://www.baidu.com
l 属性列表
属性名 中文命名 值类型 值必须 描述 token 令牌 String 是 treeCode 机构树编码 String 是 如果为空表示根机构,默认填写” ROOT” code 机构代码 String 是 start_date 开始日期 Date 合同或项目的开始日期 name 机构名称 String 是 end_date 结束日期 Date 合同或项目的结束日期 user_num 驻点人员数量 Int supplier_name 供应商名称 String type 机构类型 String 是 项目机构ProjectOrg,行政机构AdministrativeOrg orgUpCode 上层机构代码 String 是 parentId 父机构code String 是 isDisabled 是否禁用 Boolean false l 响应属性列表
属性名 中文命名 值类型 值必须 描述 code 返回码 String 是 message 返回信息 String 是 如果为空表示根机构,默认填写” ROOT” data 返回内容 String 是 l JSON数据示例**
[http://xxxxxxxx/xxx/xxx] 请求参数: " { “token”,””, //必填 “treeCode”,” EXECUTIVE”, //必填 “code”,””, //必填 “entity”,” { "code":"2222", //必填 " start_date":"", "name":"字段名称", //必填 "end_date ":"", "user_num":"", "supplier_name":"", “type”,””, //指定类型 "orgUpCode":"11111", //必填 "parentId":"1111111", //必填 “isDisabled”:” false” //是否禁用 } " 响应:login JSON - 数据示例 { "success": true, "data": { "treeId": "ROOT", "parentId": 112034, "name": "3333", }, "errorCode": null, "errorName": null, "errorMessage": null, "errorException": { "name": null, "message": null, "trace": null } }
至此,一个简单的接口文档差不多就是这些内容,下面将会介绍一下复杂的做法(内容较多)
复杂版本
由于不同的公司有不同的文档格式要求,这里只给出我看过的几个文档罗列下来的一些文档内容,不一定通用,也不一定是很完美的,但是希望内容可以具备一定的参考价值。
复杂版本的内容有点多。请耐心观看或者收藏再看(=v=)
复杂版本的目录格式
+ 封面 + 接口文档名称 + 接口版本号 + 版权说明 + 文档信息 + 标题 | 创建时间 | 打印时间 | 文件名 | 存放目录 | 所有者 | 作用 + 小题:版权声明 + 版本历史(重点1) + \| 版本号 \| 日期 \| 修改者 \| 描述 \| + \| v1.0.0 \| xxx \| xxx \| xxx | + 目录 + 结构清晰 + 有条理 + 能快速定位需要的信息(后文会介绍) + 文档具体内容部分 + 编写目的 + 对接准备事项 + 测试联调 + 上线 + 使用协议 + 规范 + 报文规范 + 请求报文规范 + 响应报文规范 + 接口描述 + 报文规范 + 请求报文 + 响应报文 + 公共报文头 + 接口码说明 + 业务接口 + 查询接口 + 加解密规范 + 原则 + 令牌信息 + 加密规范 + 解密规范 + 业务接口 + 具体接口1: + 说明 + 规范码(查表) + 使用方式 + 请求字段 + 响应字段 + 案例 + 具体接口2.... ........ + 附录 + 参考资料1 + 参考资料2 + 其他.....
案例:
封面:
封面还是比较重要的,毕竟是打开文档的第一眼内容,下面用阿里的文档作为参考,可以看到封面一般是如下内容:
- 公司名称
- 文档名称
- 版本号
文档信息:
文档信息主要记录这份文件的产生日期以及具体的创建打印日期等。
文档名 内容 标题 一份帅气的文档 创建日期 20xx-xx-xx 打印日期 20xx-xx-xx 文件名 文档的全名 存放目录 文件位置 所有者 某某公司 作者 张三 版权声明:(现在这个时代版权是极其重要的)
xxxx所有,不得三方借阅、出让、出版
版本历史:
版本历史是很重要的,每次改动都需要有详细的记录,这样才能保证文档的干净和有效,同时可以方便review的时候,对于文档的修订者进行文档审查
版本号 日期 概述 修订者 1.0.0 20xx-xx-xx 创建 张三 1.0.1 20xx-xx-xx 修改文档第一小节内容 李四 1.0.2 20xx-xx-xx 修订文档第四小节的错误描述,更新文档说明 王五 目录:
好的文档一定有好的目录,只要按照一定的规范和格式写出来的文档,一般看上去都是十分舒服的。还是用阿里的开发手册做参考
文档具体内容部分
这一部分发挥的自由空间就比较大了,不同的业务不同的公司不同的需求不同的人都能写出万千种格式的文档,所以这里也是给一个样例做参考使用。是否有实用价值因人而异。
为了不让整个目录树太长,这里没有做标题说明=-=
编写目的:
需要解决什么问题,为什么要这份文档,这份文档有什么参考价值?
对接准备事项:
接口方可以提供什么内容,接口方需要对接方的那些内容,以及提供的其他信息,比如需要对接方提供 系统应用id,系统唯一标识。向对接方提供密钥等等
1. 测试联调:分配测试的密钥,测试环境的账户和密码以及其他信息
2. 上线:上线之后需要做什么事情,如:替换生产url,替换生产环境账户密码,替换密钥为生产密钥等等
使用协议 + 规范:
可以是本次对接使用的算法,通信协议,可以是术语说明或者和业务相关的其他说明,以及对接的要求都可以,发挥空间很大,自由设计。
报文规范:
报文规范是接口对接的核心部分,因为对接大部分的时间基本都是花在接口参数调试和请求调试等。所以报文规范算是非常重要的内容。具体内容可以参考简单版本的接口描述,也可以使用目录格式进行对应的描述
+ 请求报文:主要为请求的Body,以及请求的header内容,一般都是Json的格式,并且要求UTF8编码 + 响应报文:返回的格式和内容,也是需要协商的部分 + 公共报文头:一般需要重复使用的参数可以作为公共报文头,但是不是所有的公共报文头都是必选,存在可选的参数 + 接口码说明:描述接口的注意事项,以及那些字段参数需要重点关注,主要为提示信息 + 业务接口:一般表示业务的返回结果,比如统一2000作为报文的成功响应码,其他所有码都是存在对应的接口码表进行设计。 + 查询接口:如何才算是表示查询成功,比如一个还钱的接口当中可能是受理中,拒绝或者处理完成,等查询接口的信息描述
加解密规范:
也是比较重要的部分,也是比较花时间的地方,需要大量调试来打通接口的地方,存在以下的几个要点
- 原则:接口存在一些简单的原则,比如
非对称加密
,数字签名
,时间戳判断有效性
,具体按照接口的原则自由设置 - 令牌信息:描述令牌是如何生成的,是比较重要的部分,一般由对接双方沟通完成,最好多以案例和代码辅助解释
- 加密规范:描述接口数据的加密过程,比较重要的内容信息,最好多以案例和代码辅助解释
- 解密规范:就是解释接口要如何解密,比如需要拿到服务端给过来的配对公钥才能解密,再比如使用签名+参数进行对照加密验证签名是否正确等。
加解密规范参考:
一般的加密方式,一般情况下做到下面这种形式基本可以屏蔽大部分的攻击:
- 按照map的key进行字典排序,同时加入
timetamp
值校验核对时间 - 把参数按照一些特殊形式拼接为
key=value&key=value
的形式,末尾带入时间戳或者其他的一些信息,比如应用Id等核实身份的内容 - 把这一串按照AES加密,然后按照BASE64编码,生成一个编码串
- 把BASE64编码进行MD5加密,加密完成之后,得到固定长度的MD5字符串
- 按照md5串+上面的string在进行一次md5加密,生成签名,那么这个签名基本上就唯一的
业务接口
这里基本可以照抄简单接口模板,因为接口描述每个人的描述不同,下面给出一些基本上涉及的点,另外,到了这一步就尽量用案例辅助,因为案例可以帮助接口阅读者更快速的上手和理解,注意这一部分的内容:实用性大于理论性
具体接口:
- 说明
- 规范码(查表)
- 使用方式
- 请求字段
- 响应字段
- 案例
附录:
可能这部分和说明书一样基本没人看,所以不做过多的解释,个人到目前为止看过的接口文档基本没有遇到附录写的很详细的,这里可以随意施展。
总结:
本篇文章将接口文档分为两种模式来讲解:
- 简单版本:核心是 怎么简单怎么来,如何工程紧或者非常讨厌写文的人可以使用这种方式,优点是出货速度快,缺点嘛,简单的东西可能造成很多细节的忽略,有时候写文的人也会忽略,所以还是需要多注意一下不要直接CV
- 复杂版本:我想基本没几个人想写这种复杂文档,一份文档写下来基本半天没了,
个人还是非常喜欢写文档的,一方面是写文档可以提高自己的文档功底,同时和费曼学习法的方式十分的贴切,可以通过写作来回顾和总结思路过程,另一方面,一份好文档真的可以省未来的时间成本,想象一下如何你可以在当别人来问你就甩一份文档解决问题的时候,可以给自己大量的时间减少自己的沟通成本,对于日常工作中被打断思路再常见不过了,用文档记录的形式记录可能在以后要回过来改代码的救一命。
有点跑偏了,总之,这篇文章更多的目的是分享自己对于文档编写的一些个人思考,个人从实习公司到转正写了个把月文档,过程十分的枯燥乏味单调,但是当回过头来看到自己的成果的时候。还是蛮有成就感了
更多相关内容 -
python接口自动化:如何在一个yaml文件中放多个接口的用例
2021-12-16 10:34:15在一个yaml文件中添加多个接口的测试用例用yaml文件实现接口自动化,本来我打算一个接口对应一个yaml文件,这样看起来比较清晰,但是后来考虑到假如有上千个接口的话,那就得新建上千个yaml文件,那么在打开项目加载的时候就会占用很大一部分资源,加载的也会很慢,所以让把一个模块的接口放在一个yaml文件里面,经过两天的尝试,成功实现
yaml文件格式
login: - name: 正常登录 request: data: username: 1251651532 password: 123456 extract: Admin-Token: '"Admin-Token":"(.*?)"' #在该接口要提取的变量,key是要保存的到的变量,value是要提取的变量 validate: code: "0" deptName: 办公室 - name: 异常登录-username为空 request: data: username: password: 123456 validate: code: "500" deptName: get_data: - name: 获取客户信息 request: data: {'customerId': 1} validate: code: '0' ownerUserName: 大大大 - name: 获取不存在客户信息 request: data: {'customerId': 3} validate: code: '500' msg: 服务器响应异常
在接口中调用的时候,只需要给每个接口传对应的yaml的数据值即可
获取yaml数据的函数
def read_yaml_file(path,part): try: with open(make_yaml_path(path), encoding='utf-8') as f: caseinfo = yaml.load(stream=f, Loader=yaml.FullLoader) new_caseinfo = caseinfo[part] # 每个接口选择对应的part,如login return new_caseinfo except Exception as f: log.Logger.error("读取用例文件异常:异常信息:%s" % str(traceback.format_exc()))
这样就和一个接口对应一个yaml的使用方法一样了
-
怎么写接口文档
2020-03-14 22:52:27一些刚开始写接口文档的服务端同学,很容易按着代码的思路去编写接口文档,这让客户端同学或者是服务对接方技术人员经常吐槽,看不懂接口文档。这篇文章提供一个常规接口文档的编写方法,给大家参考。一些刚开始写接口文档的服务端同学,很容易按着代码的思路去编写接口文档,这让客户端同学或者是服务对接方技术人员经常吐槽,看不懂接口文档。这篇文章提供一个常规接口文档的编写方法,给大家参考。
推荐使用的是 http://docway.net 写接口文档,方便保存和共享,支持导出PDF MARKDOWN,支持团队项目管理。
一、请求参数
1. 请求方法
- GET
用于获取数据 - POST
用于更新数据,可与PUT互换,语义上PUT支持幂等 - PUT
用于新增数据,可与POST互换,语义上PUT支持幂等 - DELETE
用于删除数据 - 其他
其他的请求方法在一般的接口中很少使用。如:PATCH HEAD OPTIONS
2. URL
url表示了接口的请求路径。路径中可以包含参数,称为地址参数,如**/user/{id}**,其中id作为一个参数。3. HTTP Header
HTTP Header用于此次请求的基础信息,在接口文档中以K-V方式展示,其中Content-Type则是一个非常必要的header,它描述的请求体的数据类型。
常用的content-type:- application/x-www-form-urlencoded
请求参数使用“&”符号连接。 - application/json
内容为json格式 - application/xml
内容为xml格式 - multipart/form-data
内容为多个数据组成,有分隔符隔开
4. HTTP Body
描述http body,依赖于body中具体的数据类型。如果body中的数据是对象类型。则需要描述对象中字段的名称、类型、长度、不能为空、默认值、说明。以表格的方式来表达最好。
示例:
二、响应参数
1. 响应 HTTP Body
响应body同请求body一样,需要描述请清除数据的类型。
另外,如果服务会根据不同的http status code 返回不同的数据结构, 也需要针对不同的http status code对内容进行描述。
三、接口说明
说明接口的应用场景,特别的注意点,比如,接口是否幂等、处理是同步方式还是异步方式等。
四、示例
上个示例(重点都用红笔圈出来,记牢了):
接口工具
推荐使用的是 http://docway.net(以前叫小幺鸡) 写接口文档,方便保存和共享,支持导出PDF MARKDOWN,支持团队项目管理。
- GET
-
jmeter多个接口怎么进行测试?接口脚本如何编写?
2022-03-22 13:40:433、创建一个 maven 项目,此处可以创建一个 quickstart,参考截图 创建好之后,大概的工程结构是这样的: 4、以上配置完毕后,开始撸代码需要继承 Jmeter 的 AbstractJavaSamplerClient 类,并实现 runTest 方法 ...目录
1、背景公司大部分的服务都是非 HTTP 的接口,都是 dubbo 接口,如今需要对一些接口做性能测试。
2、工具准备Jmeter 3.2、 Java IDE(本文采用 IDEA),Maven 作为包管理工具
3、创建一个 maven 项目,此处可以创建一个 quickstart,参考截图
4、以上配置完毕后,开始撸代码需要继承 Jmeter 的 AbstractJavaSamplerClient 类,并实现 runTest 方法
5、上面那个类是不需要从 jmeter 中获取参数,如果要从 jmeter 中获取相关的参数,可以参考下面这个类
7、调试通之后,将代码打成 jra 包注意,需要将 xsd,dubbo-config.xml 都要打在 jar 包里面,需要在 pom 文件中,还需要配置一些插件
10、此处可以把参数放在 csv 文件里,然后测试各种不同的场景
11、以上做完之后,简单调试下脚本,能够正常运行,然后将相关的依赖,脚本,数据文件传到压测机上,调整线程数,进行正式的压测
前言
接口测试包含单接口测试和多接口测试,通过组合多个接口实现一组功能的验证称为多接口测试,单接口重在单个接口多种请求组合的响应断言,多接口重在组合不同接口,实现流程的串联和验证。
当我们在工作中进行接口测试时,项目的接口肯定不止一个,而是很多很多,而且每个接口都需要进行正确参数,错误参数,参数为空,特殊字符等方式来测试接口是否能够正确返回所需的响应值。
今天,我们来一起学习一下怎么用JMeter完成批量的接口测试吧!
1、背景
公司大部分的服务都是非 HTTP 的接口,都是 dubbo 接口,如今需要对一些接口做性能测试。2、工具准备
Jmeter 3.2、 Java IDE(本文采用 IDEA),Maven 作为包管理工具3、创建一个 maven 项目,此处可以创建一个 quickstart,参考截图
创建好之后,大概的工程结构是这样的:其中,resource 中存放 dubbo 配置文件。
说到 resources,此处有一个坑,dubbo-config.xml 中的 这个http://code.alibabatech.com/schema/dubbo/dubbo.xsd xsd 文件,由于 code.alibabatech.com 已经停止了服务,需要使用下载一个 xsd 然后进行本地导入。此处也可以不用下载,直接在 pom 文件中,配置 dubbo 的依赖,然后下载 dubbo.jar,解压后就会有 dubbo.xsd 文件,拷贝出来即可,参考下图
pom.xml 文件配置
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--jmeter依赖的jar包--> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_core</artifactId> <version>3.2</version> <exclusions> <exclusion> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> </exclusion> <exclusion> <groupId>commons-math3</groupId> <artifactId>commons-math3</artifactId> </exclusion> <exclusion> <groupId>commons-pool2</groupId> <artifactId>commons-pool2</artifactId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/com.101tec/zkclient --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.3</version> <exclusions> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_java --> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_java</artifactId> <version>3.2</version> <exclusions> <exclusion> <groupId>commons-math3</groupId> <artifactId>commons-math3</artifactId> </exclusion> <exclusion> <groupId>commons-pool2</groupId> <artifactId>commons-pool2</artifactId> </exclusion> </exclusions> </dependency> <!--spring依赖的jar包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.36</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
以上 pom 文件配置都是一些基本的配置,没有配置要测试的接口的依赖的 jar 包,实际操作过程中,需要加上。
dubbo-config.xml 的配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <dubbo:application name="要测试接口的应用名" owner="某人"/> <dubbo:monitor protocol="registry"/> <!-- 使用注册中心暴露发现服务地址 --> <dubbo:registry address="zookeeper://zk的地址"/> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="iPromiseDubboService" interface="com.dmall.promise.dubbo.IPromiseDubboService" timeout="5000" check="false"/> </beans>
4、以上配置完毕后,开始撸代码
需要继承 Jmeter 的 AbstractJavaSamplerClient 类,并实现 runTest 方法public class QueryTimeInfoBySlotId extends AbstractJavaSamplerClient { private static final ApplicationContext context = new ClassPathXmlApplicationContext("dubbo-config.xml"); private static IPromiseDubboService iPromiseDubboService; public void setupTest(JavaSamplerContext arg0){ iPromiseDubboService=(IPromiseDubboService)context.getBean("iPromiseDubboService"); } public SampleResult runTest(JavaSamplerContext javaSamplerContext) { SampleResult sr = new SampleResult(); Long timeSlotId=20000l; try{ sr.sampleStart(); //此处可以增加请求的label,也可以就这样 // sr.setSampleLabel(title); PromiseRemoteResponse<TimeInfo> responseData=iPromiseDubboService.queryTimeInfoBySlotId(timeSlotId); if(responseData!=null && "0000".equals(responseData.getCode())){ sr.setSuccessful(true); sr.setResponseData("code: " + responseData.getCode()+"message: " + responseData.getMessage(),"utf-8"); }else { sr.setSuccessful(false); } sr.sampleEnd(); }catch (Exception e){ e.printStackTrace(); } return sr; } public void teardownTest(JavaSamplerContext arg0){ } }
5、上面那个类是不需要从 jmeter 中获取参数,如果要从 jmeter 中获取相关的参数,可以参考下面这个类
public class QueryAllOptionalPeriod extends AbstractJavaSamplerClient { private static final ApplicationContext context = new ClassPathXmlApplicationContext("dubbo-config.xml"); private static IPromiseDubboService iPromiseDubboService; // 该方法设置的参数,都会出现在jmeter的参数列表中,并且展示相关设置的默认值 public Arguments getDefaultParameters(){ Arguments params = new Arguments(); params.addArgument("title","casetitle"); params.addArgument("erpStoreId", "110"); params.addArgument("latitude", "116.435292"); params.addArgument("longitude","39.994951"); params.addArgument("saleType","1"); return params; } public void setupTest(JavaSamplerContext arg0){ iPromiseDubboService=(IPromiseDubboService)context.getBean("iPromiseDubboService"); } public SampleResult runTest(JavaSamplerContext javaSamplerContext) { SampleResult sr = new SampleResult(); //从jmeter 中获取相关的参数,组装后,调用相关的接口 long erpStoreId=Long.parseLong(javaSamplerContext.getParameter("erpStoreId")); Double latitude=Double.parseDouble(javaSamplerContext.getParameter("latitude")); Double longitude=Double.parseDouble(javaSamplerContext.getParameter("longitude")); String title=javaSamplerContext.getParameter("title"); Integer saleType=Integer.parseInt(javaSamplerContext.getParameter("saleType")); System.out.println("param is : tilte is : " + title+"erpStoreId: " + erpStoreId + "latitude : "+ latitude + "longitude: " + longitude +"saleType: " +saleType); PromiseVO promiseVO = new PromiseVO(); promiseVO.setErpStoreId(erpStoreId); Location location = new Location(); location.setLongitude(longitude); location.setLatitude(latitude); promiseVO.setUserLocation(location); promiseVO.setSaleType(saleType); try{ sr.sampleStart(); sr.setSampleLabel(title); PromiseRemoteResponse<List<OptionalPeriod>> responseData=iPromiseDubboService.queryAllOptionalPeriod(promiseVO); if(responseData!=null && "0000".equals(responseData.getCode())){ sr.setSuccessful(true); sr.setResponseData("code : " + responseData.getCode() + "message: " + responseData.getMessage(),"utf-8"); }else{ sr.setSuccessful(false); } sr.sampleEnd(); }catch (Exception e){ e.printStackTrace(); } return sr; } public void teardownTest(JavaSamplerContext arg0){ } }
6、调试代码
写完了,固然可以打成一个 jar 包,然后传到 jmeter 的 lib/ext 下面进行调试,但是这样太麻烦了
这里可以直接用 main 方法调试
当这里 main 方法调试成功了后,再打 jar 包,上传到 jmeter 的相关路径,再进行测试,会高效很多。public class TestMain { public static final void main(String [] args){ JavaSamplerContext arg0 = new JavaSamplerContext(new Arguments()); QueryPreSaleOptionalPeriod test=new QueryPreSaleOptionalPeriod(); test.setupTest(arg0); test.runTest(arg0); } }
7、调试通之后,将代码打成 jra 包
注意,需要将 xsd,dubbo-config.xml 都要打在 jar 包里面,需要在 pom 文件中,还需要配置一些插件<build> <plugins> <!--复制jar包插件,将使用到的jar包,复制到target/lib中--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>add-resource</id> <phase>generate-resources</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>TestMain.Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins>
这样,执行 maven package 后,targer 下面会有两个东西,是我们需要的:
将此处的 jar 文件拷贝到 jmeter 的 lib/ext 里面
然后将 lib 下面的各种依赖的第三方的 jar 拷贝到 jmeter 的的 lib-dependency(自己创建一个就行)8、因为步骤 7 中引入的第三方的 jar 包都放在了 lib-dependency 中,所以需要指定 jmeter 启动的时候,加载这个目录下的 jar 包
修改 jmeter.properties 中的 search_paths,配置相关的依赖的 jar 的路径9、启动 jmeter,创建一个 java 请求,
10、此处可以把参数放在 csv 文件里,然后测试各种不同的场景
11、以上做完之后,简单调试下脚本,能够正常运行,然后将相关的依赖,脚本,数据文件传到压测机上,调整线程数,进行正式的压测
本文完
下面是 jmeter 在非 GUI 模式下的分布式测试配置和操作,可以参考。
性能测试过程中,一般是找个 linux 服务器,用命令行模式进行压测
jmeter non GUI 运行分布式压测
前期准备:master 和 slave 尽量使用相同的 jmeter 版本,避免一些奇葩的问题。配置
slave 机器:启动 jmeter-server &(后台启动)
master 机器:配置 remote_host= slave 机器的 ip
PS: 此处如果 master 也要参与压测,需要启动 master 机器上的 jmeter-server,然后 remote_host 中需要配置 master 机器的 ip启动命令,在 master 机器上执行:
方式一:指定其中一台机器或者多台
sh jmeter.sh -n -t ../../promise-test/testcase10.jmx -R 192.168.90.130
方式二:全部的 slave 都躁起来压测
sh jmeter.sh -n -t ../../promise-test/testcase10.jmx -r
Attention:注意 slave 和 master 的 host 配置,一定要有这条 host,
本机 ip hostname (不可以是 127.0.0.1,也不可以是 localhsot) 参考 URL: JMeter - User's Manual: Remote (Distributed) Testing衷心感谢每一个观看我文章的人,喜欢的话那就动手给博主点个关注吧!!!
-
swgger上传多文件的接口文档
2019-05-13 12:39:33最近在写前后端分离的项目,后端用的mutipartFlie数组接收多文件,我用的是swagger接口文档,但是,接口文档给我的是一个文本域,根本没法调试,靠前端来调试?不太现实。然后搜索了一波,发现了swagger-bootstrap-... -
ElementUI :el-upload调用一次接口同时上传多个文件及表单
2019-12-09 09:35:00el-upload组件默认情况下上传多少个文件就会请求多少次上传接口 实现请求一次接口同时上传多个文件及表单 实现方案 multiple 支持多选文件 :auto-upload="false" 不在选取文件后立即进行上传 :... -
Springboot一个接口对应多个实现类的完整操作
2019-10-15 15:31:29我们在springboot项目当中需要在保存文件,你配置了什么,就按照那种方式保存 1:本地保存 2:fastDFS服务器保存 3:MongoDB保存 首先你的接口层 然后Service层,分别有3个 注意一点是 @Configuration @... -
后端开发之如何写接口设计文档
2021-04-15 15:07:55系统A调用系统B,系统B调用系统C,像是把多个系统连接起来的一座桥梁,各自遵守相同的约定,但他本身是一种协议。它规范了传入的对象所必须具备的某些特征,从而保证在调用时既不会发生错误又不需要提前检查。 ... -
接口文档与接口文档管理工具
2021-07-12 11:16:45应用程序的开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。 2.接口文档的功能与目的: (1)项目开发过程中前后端工程师有一个统一的文件... -
JAVA一个文件写多个类 ( 同级类 ) 规则和注意点
2018-11-22 22:11:12在一个.java文件中可以有多个同级类, 其修饰符只可以public/abstract/final/和无修饰符 public修饰的只能有一个,且必须要与文件名相同; 因为jvm虚拟机为了提高查找类的速度,使用import语句导入的时候,只会... -
MyBatis中一个Dao接口文件如何对应多个SQL映射文件(Mapper)
2018-12-24 16:52:24在仅使用MyBatis框架的基础上(不与Spring等进行整合),我的项目中有一个接口UserDao,具体接口代码如下: 当采用Mapper动态代理时,一般是创建一个SQL映射文件UserMapper.xml,然后将该SQL映射... -
自动化(三)使用Jmeter串联调用多个接口
2021-03-24 15:40:01使用Jmeter串联调用多个接口 Jmeter接口数据传递使用Jmeter串联调用多个接口前言目标:登录一批账号后,立即使用该账号发送一批日记一、单独建立接口请求1.用Charles抓取app登录和发布日记的接口2.代入已有的参数... -
教你写接口需求文档
2020-07-19 12:00:00作者:果果 转载已取得作者授权一、什么是接口百科上对接口的定义:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的... -
如何写一个webService接口
2018-03-06 18:57:37第一次写接口的时候,感觉太过笼统,压根不知道接口是个什么东东,,后来自己也查了好多资料,才发现其实接口可以就认为是一个方法,自己多写几种以后就会发现挺简单的,自己整理了一下资料,纯属增强自己的记忆,也... -
HttpRequest远程访问接口带多个文件上传
2020-09-10 10:57:54将要上传的文件添加到File类数组中,map中还是put file package com.chuangqi.AAATest; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Console; import cn.hutool.http.Header; import ... -
先写接口文档还是先开发
2021-03-31 22:17:20文章目录先写接口文档是正确的为什么有的人喜欢先写接口什么情况可以先写接口 之前都是个人维护一个项目,一直都是先开发,然后再写文档,也能保证功能的正确实现。 突然有一个大功能,需要多方协调。还是先开发,被... -
为什么Java中一个类可以实现多个接口,但只能继承一个类?
2019-12-27 09:16:14多继承会产生钻石问题(菱形继承) 类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法 ...接口中的方法是抽象的,一个类实现可以多个接口 假设这些接口中存在相同方法(方法名与参数相同),... -
JMeter、Postman、Requests接口测试经验分享-一个参数传多个值(一)(举例)
2019-01-05 11:17:16某一个参数需要传递多个值 -
接口文档以及接口测试用例
2022-03-24 11:34:27接口文档的产生: 是后端人员提供的接口API文档 比如说 java后台 python 或者是C/C++(现状是前后端分离) 接口文档中包含: 请求方式 路径 参数 响应文本内容 请求头 请求体 测试人员: 首先拿到接口文档,分析... -
什么是接口文档,如何写接口,有什么规范?
2018-11-29 09:19:52正规的团队合作或者是项目对接,接口文档是非常重要的,一般接口文档都是通过开发人员写的。一个工整的文档显得是非重要。 项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发,项目维护中或者项目人员... -
几个在线文档接口生成工具
2021-01-03 22:43:49说实话,这个需求看起来简单,但是实际上一点的都不简单。 我花了几天时间到处百度,谷歌,技术博客 和 论坛查资料,先后调研了如下文档生成工具: 一、gitbook 开发语言:javascript 用户:50万+ 示例地址:... -
联合阿里在职测开工程师耗时一个星期写的 【接口测试+自动化接口接口测试详解]
2022-02-21 20:53:37字典是一种存储类型,json是一种格式(完全不同) json.loads()函数是将json字符串转化为字典(dict) json.dumps()函数是将字典转化为json字符串 json.dump()和json.load()主要用来读写json文件函数 2:接口自动... -
java快速生成接口文档方法总结
2021-07-27 19:36:22通常来说,接口文档属于产品的技术沉淀,是一个长期积累的过程,然而,很多时候,开发阶段并不会想的那么多,结果到了需要接口文档的时候总是疲于应付,情急之下,往往采用最笨拙的办法,就是对照着项目代码,一个个... -
Java写接口如何编写
2021-08-04 11:48:33编写接口方法 首先我们要了解的就是java接口当中常量的修饰关键字,以及函数的修饰关键字是...除此之外,还要明白,接口当中的所有成员都是public,这个是我们一定要清楚的。 除了这个之外,还要知道,接口当中所有的 -
Jmeter多接口关联并发测试
2019-11-01 09:46:40@jmeterTOC 欢迎使用Markdown编辑器 你好!...我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ... -
怎么写接口
2019-08-09 09:43:35工作当中,逐渐多的出现不使用页面展示数据,直接使用数据接口,这样的好处: 1、首先可以实现动静分离。将数据库和查询和页面渲染彻底分开。 2、网站可以支持脚本批量开发。 请求接口的方式 最原始的接口搭建是使用... -
自从我用了这个接口文档版本管理,我的组长多活了几年
2017-11-02 18:06:02自从我用了这个接口文档版本管理,我的组长多活了几年。 -
jmeter接口并发测试,多个用户登录,并提取token传入下个接口
2021-10-22 17:24:49然后最近又遇到了新的问题,我在测试多用户同时登录的时候,发现之前的方法每次只能传入一个token,于是学习了一下,方法如下: 准备用户登录的接口,接下来我们需要准备测试账号了,我这里使用20个账号,然后新建... -
用swagger-ui展示不同路径多个项目的接口文档
2017-09-14 18:29:5811,输入http://localhost:3000/static /dist/index.html即可看到接口文档 ,二 ,后台启动node 安装 npm install forever -g forever start index.js就可以了,如果forever命令找不到,记得做个软连接...