一 简介
1、Postman是一款功能超级强大的用于发送 HTTP 请求的软件 。
1)创建和发送任何的HTTP请求,请求可以保存到历史中再次执行
2)使用Postman Collections可以更有效的测试及集成工作流管理和组织APIs
3)可以依据你创建的Clollections自动生成API文档,并将其发布成规范的格式
4)通过同步连接你的team和你的api,以及权限控制
2、下载安装postman
3、设置环境变量
有时需要在不同的环境下跑相同的测试,此时可以通过设置环境变量来动态选择。点击右上角的设置按钮:
填写该环境的名称:如测试环境,并在key和value中填写需要的键值
使用这些键值的时候只需要加上两个花括号引用key,如{{base_url}}/username,创建好所有环境后,在跑用例的时候在右上角下拉列表选择需要的环境就好
二、请求
HTTP请求的4部分:URL,请求的method,headers,body。
2.1Method
2.2 URL
首先需要设置的就是URL
2.3 Authorization
如果访问的服务需要验证,这里可以设置验证方式+填写验证所需的信息,比如用户名密码。
参考: Authentication helpers
postman有一个helpers可以帮助我们简化一些重复和复杂的任务。当前的一套helpers可以帮助你解决一些authentication protocols的问题。
Basic Auth填写用户名和密码,点击Refresh headers
Digest Auth要比Basic Auth复杂的多。使用当前填写的值生成authorization header。所以在生成header之前要确保设置的正确性。如果当前的header已经存在,postman会移除之前的header。
OAuth 1.0 apostman的OAuth helper让你签署支持OAuth 1.0基于身份验证的请求。OAuth不用获取access token,你需要去API提供者获取的。OAuth 1.0可以在header或者查询参数中设置value。
OAuth 2.0 postman支持获得OAuth 2.0 token并添加到requests中。
2.4 headers
输入key-value时,会有自动提示的下拉面板:
有些headers和cookies是保密的,如:
1.Accept-Charset
2.Accept-Encoding
3.Access-Control-Request-Headers
4.Access-Control-Request-Method
5.Connection
6.Content-Length
7.Cookie
8.Cookie 2
9.Content-Transfer-Encoding
10.Date
11.Expect
12.Host
13.Keep-Alive
14.Origin
15.Referer
16.TE
17.Trailer
18.Transfer-Encoding
19.Upgrade
20.User-Agent
21.Via
2.5 Request body
body编辑分为4个区域,不同的body根据body类型选择不同的控制。
form-data是网页表单用来传输数据的默认格式。可以模拟填写表单,并且提交表单。可以上传一个文件作为key的value提交(如上传文件)。但该文件不会作为历史保存,只能在每次需要发送请求的时候,重新添加文件。
x-www-urlencoded同前面一样,但不能通过这个编码模式上传文件。该模式和表单模式很容易混淆。urlencoded中的key-value会写入URL,form-data模式的key-value不明显写入URL,而是直接提交。
raw request可以包含任何东西。所有填写的text都会随着请求发送。
binary可以发送Image文件,audio文件 , video文件,text文件。 也不能保存历史,每次选择文件,提交。
2.6 Pre-request Script
参考:Pre Request Scripts
请求前需要执行的脚本可以放置在这里。主要进行一些环境以及全局变量的设置。
2.7 Tests
参考:Writing Tests Testing examples
这里写测试用例,进行一些判断等等。下面新建了两个测试用例,名字分别是”Status code is 200“ 、”Status code name has string“。
“responseCode.code === 200” 返回 True 或者 False,进而判断 ”Status code is 200“ 这个用例是Pass还是Fail。
2.8 code
可以将当前的请求以代码的方式导出来。默认是python3。
三 响应
保证API响应的正确性,就是你需要做的大部分工作。postman的response视图部分可以进行查看。一个API的响应包含body、headers、响应状态码。postman将body和headers放在不同的tabs中。响应码和响应时间显示在tabs的旁边。将鼠标悬停在响应码上面可以查看更详细的信息。
1 查看responses
2 三种视图查看body
Pretty格式化了JSON和XML,方便查看。 点击里面的URL,postman会创建一个request:
点击左边的三角可以折叠展开:
Raw 是text,不会进行任何高亮显示
Preview 有的浏览器会返回HTML的错误,对于找问题比较方便。
3 cookies
可以显示browser cookies,需要开启Interceptor。
四 编写Test
Postman的Tests标签可以用来写测试:
这里本质上是用javascript代码,在此可以为tests object设置values。这里使用描述性文字作为key,检验body中的各种情况,当然你可以创建任意多的key,这取决于你需要测试多少点。 tests也会随着request保存到collection中。
在request的test中创建了test后,再进行request,test results的结果在response的test中查看。 注意: 1.这里的key描述必须是唯一的否则相同描述只会执行第一个。2.这里的key可以使用中文。例子:tests[“Body contains user_id”] = responseBody.has(“user_id”)这里描述性的key为:Body contains user_id。检测点为:responseBody.has(“user_id”),意思是检测返回的body中是否包含”user_id”这个字段。
查看responses中的Tests结果:记过显示每个key,也就是我们测试点的具体结果,是否通过。
Snippets
用于快速添加常用的测试代码。可以自定义snippets。
Testing examples
测试代码会在发送request并且接收到responses后执行。
1.设置环境变量 postman.setEnvironmentVariable("key", "value");
2.设置全局变量 postman.setGlobalVariable("key", "value");
3.检查response body中是否包含某个string tests["Body matches string"] =responseBody.has
("string_you_want_to_search");
4.检测JSON中的某个值是否等于预期的值
var data = JSON.parse(responseBody);tests["Your test name"] = data.value === 100;
JSON.parse()方法,把json字符串转化为对象。parse()会进行json格式的检查是一个安全的函数。 如:检查json中某个数组元素的个数(这里检测programs的长度)
var data = JSON.parse(responseBody);tests["program's lenght"] = data.programs.length === 5;
5.转换XML body为JSON对象 var jsonObject = xml2Json(responseBody);
6.检查response body是否与某个string相等 tests["Body is correct"] = responseBody === "response_body_string";
7.测试response Headers中的某个元素是否存在(如:Content-Type)
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type"); //getResponseHeader()方法会返回header的值,如果该值存在
或者:
tests["Content-Type is present"] = responseHeaders.hasOwnProperty("Content-Type");
上面的方法,不区分大小写。下面的方法,要区分大小写。
8.验证Status code的值 tests["Status code is 200"] = responseCode.code === 200;
9.验证Response time是否小于某个值 tests["Response time is less than 200ms"] = responseTime < 200;
10.name是否包含某个值 tests["Status code name has string"] = responseCode.name.has("Created");
11.POST 请求的状态响应码是否是某个值 tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;
12.很小的JSON数据验证器
var schema = { "items": { "type": "boolean" }};var data1 = [true, false];var data2 = [true, 123];console.log(tv4.error);tests["Valid Data1"] = tv4.validate(data1, schema);tests["Valid Data2"] = tv4.validate(data2, schema);
结果:
五 运行Collections
postman允许你运行collection,你可以运行任意的次数。 最后会给出一个整体运行的结果。postman会保存每一次运行的结果,这样可以比较每一次运行结果的不同。选择collection,选择环境。点击运行按钮。
在需要csv和json文件的地方记得添加。
运行collection测试会在另一个窗口运行。如果需要在main窗口修改东西,在新窗口能正常读取
六、PostMan
配置Mock
服务
PostMan
除了能很方便的测试后端接口,让后端童鞋们能略过前端直接检测接口的同时呢。
也能让前端童鞋们不用催着、等着后端童鞋们写接口了,我们可以通过Mock
来本地模拟真实接口,返回固定数据。这样在数据结构确定之后,我们就可以直接开写代码咯,最后再切换成真实接口即可。
那接下来看看怎么配置吧。
创建接口集合
通常我们会将一个项目的接口放在一起,因此我们先建立一个接口的集合,用来存放我们所有的接口。
先在左侧点击Collections
切换到集合的面板, 再点击下面的添加图标,开始添加一个集合
在这里输入名称和描述即可,其他信息暂时我们可以不用关心。填写好了之后直接点击
Create
即可,然后就可以在Collections
的面板中看到我们刚刚新建的。
在集合中添加一个接口
上一步我们已经将接口的集合创建好了,现在我们可以开始添加具体的接口了。让我们先添加一个登录的接口。
选中我们刚刚新建的项目浅入深出Vue
,左侧有个小箭头可以展开噢(右侧也有一个的,一般在那添加,这里是第一个,所以可以快捷一点),然后我们来点击Add Requests
,填写接口名称和描述后点击Send to 浅入深出Vue
即可
因为我们只填写了名称和描述,所以我们可以看到刚新建的登录
接口还是个GET
方法噢,选中登录
接口可以看到右侧有详情信息。
添加环境
环境这个概念,可以通俗一点的理解成一个集合。我们把同一个项目中用到的一些重复的变量,比如说接口的域名www.xxx.com
,我们就可以放在环境里面当成一个变量。正式环境与测试环境可以随时切换,而不用我们去每个接口都修改一下。
在右上角有一个齿轮图标,点击之后弹出环境的列表,我们先点击Add
新增一个。
暂时我们先填写名称就好。
创建Mock Server
准备工作都做好了,我们可以开始创建一个虚拟服务来给我们写前端用了。选中我们的集合浅入深出Vue
, 右侧的小箭头点击后会展开这个面板。我们打开Mocks
一栏,点击Create mock server
开始创建我们的虚拟服务。
这里我们选择刚刚建立的环境就好,这里不用选择私有的,以后如果是不便公开的接口,可以选择私有的,选择私有的话是需要去创建一个Api Key
这里我们略过这个步骤。
创建完成
回到我们的Mocks
面板, 就可以看到我们刚刚创建的虚拟服务地址了,复制一下,待会就派得上用场了。
为虚拟服务地址建立环境变量
随便点开一个接口,当然, 我们现在只有一个登录
接口。点开后,右上角齿轮选择我们之前建立好的环境。
按图中所示,我们新建了一个api_url
的环境变量,这个环境变量就是我们虚拟服务的url
。
为接口添加虚拟的返回数据
在这一步之前,记得在齿轮的左边那个下拉框中选择刚刚新建的环境噢。
选择登录
接口,右上角有一个Examples
,点击,然后选择Add Examples
添加一个返回数据的示例。
在地址那一栏,我们就可以使用{{环境变量}}
的方式来使用我们新建的环境变量,这里我们将{{环境变量}}/login
当做我们登录的接口地址。实际上这么写是等价于创建的虚拟服务url/login
噢。
接下来我们在下面填传入的参数,以及传入的方式。这里选择的是将参数附在Body
里面作为form-data
传上来。
最后我们在下面的返回数据中,填入我们的返回数据。这里若羽选择的是JSON
。
保存之后不要忘了将类型改成POST
噢,examples
里的和集合
中的都记得改成POST
噢。
一般登录这种带有用户数据的接口都会采用POST
的方式。
测试一下
选中我们的登录
接口,将我们要发送请求的地方改成和之前examples
中一样的url,然后点击Send
。等待一小会儿之后我们就会发现返回的Body
中显示了我们之前预设的数据。
大功告成~
LoadRunner实现接口测试
LoadRunner可以用做接口测试。
接口使用说明书要求如下:
接口测试地址:/SNS/Publish
请求报文参数说明:
参数名称 |
参数描述 |
字符类型 |
字符值 |
SNSID |
社区ID |
String |
6 |
UserID |
用户ID |
String |
10 |
CommentsTypeID |
评论类型ID |
String |
2 |
CommentsID |
评论ID |
String |
10 |
AuthorID |
作者ID |
String |
10 |
CommentsContent |
评论内容 |
String |
50 |
请求报文格式:
|
应答报文的参数接口说明:
参数名称 |
参数描述 |
字符类型 |
字符值 |
UserID |
用户ID |
String |
10 |
CommentsTypeID |
评论类型ID |
String |
2 |
CommentsID |
评论ID |
String |
10 |
CommentsContent |
评论内容 |
String |
50 |
StatusCode |
返回值 |
Int |
0代表pass,非0代表fail |
StatusText |
返回信息描述 |
String |
|
|
LoadRunner中涉及到向服务器发送请求的API方法包括:web_url(),web_submit_form(),web_submit_data(),web_custom_request()。下面介绍两种我常用的方法:
方法一:使用web_submit_data()
web_submit_data("insert", |
方法二:使用web_custom_request()
char str[1000]; |
web_custom_request和web_submit_data区别,现附录如下:
- web_custom_request方法可以发送POST和GET类型的请求;
- web_submit_data只能发送POST类型的请求;
- 所有web_submit_data方法发送的请求都可以使用web_custom_request来实现
- web_custom_request可以实现web_submit_data无法实现的请求,比如“查询所有邮件并删除”这个案例中,查询时我们使用关联把所有邮件对应的标识抓取成一个数组,如果使用web_submit_data来完成这个删除的请求,需要很多个web_submit_data请求才能完成,但使用web_custom_request就可以通过一个请求完成,方法是自己写代码拼一个eb_custom_request
- 方法POST请求的Body值。
- web_submit_data请求中提交的数据格式:“Name=属性名称,”,“Value=属性值”
- web_custom_request提交的数据(body)格式:“Body=属性名称=属性值&属性名称=属性值&……”
我们在做接口功能测试的时候会很注意接口的应答报文的信息,这时候我们可以通过LoadRunner的日志信息查看或者可以通过web_reg_find()或者web_find()这样的API函数来统计接口的运行结果,推荐使用web_reg_find(),web_reg_find()和web_find()区别请大家百度一下,详细信息太多,在这里不便叙述。
因为web_reg_find()是注册型函数,所以应该放在web_submit_data()或者web_custom_request()的前面。
如:
web_reg_find("Text= |
在脚本的最后我们可以对查询字段的信息进行统计
// Check result |
业务场景是在客户端根据具体车牌查询相关车辆信息,结果返回前10条记录。接口的请求参数和返回结果均是JSON字符串,请求可以用POST或者GET方法。先说GET方法:
一、GET方法测试
- Insert - New step -选择Custom Request - web_url
- 填入相应参数
- 生成脚本,并修改如下
Action()
{
//添加集合点
lr_rendezvous("jihedian");
lr_start_transaction("getTop10");
//插入检查点,检查返回值是否包含kakoTypeName
web_reg_find(
"Search=Body",
"Text=kakoTypeName",
LAST );
//发送get请求
web_url("www.abc.com",
"URL=http://192.168.3.33:9200/_search?{%22query%22:{%22bool%22:{%22must%22:[{%22term%22:{%22plateNumNond%22:%22%E9%B2%81{NewParam}%22}}],%22must_not%22:[],%22should%22:[]}},%22from%22:0,%22size%22:10,%22sort%22:[],%22aggs%22:{}}",
"TargetFrame=",
"Resource=0",
"RecContentType=application/json",
"Snapshot=t1.inf",
"Mode=HTML",
LAST );
lr_end_transaction("getTop10", LR_AUTO);
//打印本次取的车牌号
lr_output_message( "the platenum is #%s", lr_eval_string( "{NewParam}" ) );
return 0;
}
4. 查看返回结果
Virtual User Script started at : 2016-09-22 14:16:53
Starting action vuser_init.
Web Turbo Replay of LoadRunner 11.0.0 for Windows 7; build 8859 (Aug 18 2010 20:14:31) [MsgId: MMSG-27143]
Run Mode: HTML [MsgId: MMSG-26000]
Run-Time Settings file: "F:\PassCarSearch\ESqueryByPlateNumNond_GET\\default.cfg" [MsgId: MMSG-27141]
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): Rendezvous jihedian
Action.c(5): Notify: Transaction "getTop10" started.
Action.c(7): Registering web_reg_find was successful [MsgId: MMSG-26390]
Action.c(12): Registered web_reg_find successful for "Text=kakoTypeName" (count=10) [MsgId: MMSG-26364]
Action.c(12): web_url("www.abc.com") was successful, 9058 body bytes, 88 header bytes [MsgId: MMSG-26386]
Action.c(20): Notify: Transaction "getTop10" ended with "Pass" status (Duration: 3.1371 Wasted Time: 0.4776).
Action.c(22): the platenum is #UT5387
Ending action Action.
Ending iteration 1.
说明:
- 返回结果中可以看到检查点和事务都成功了,表明我们的脚本编写无误。
- 查看服务器返回的结果需在Vuser-Runtime-settings的log选项下,勾选Enable-logging、Extended log、Data returned by server 。
二、POST方法测试
在用POST方法创建脚本时遇到了点波折——先是使用了函数web_submit_date,执行时报错,查询资料没找到原因,不知道是不是该函数不支持JSON串,有兴趣的可以自己试下。然后尝试用web_custom_request函数,执行后返回的结果都正确,ok,就它了。
- Insert - New step -选择Custom Request - web_custom_request
- 填入相应参数
- 生成脚本,并修改如下(参数中的引号"前需要加斜杠\转译)
Action()
{
lr_start_transaction("querybypost");
//插入检查点,检查返回值是否包含t_query_data
web_reg_find(
"Text=max_score",
LAST );
web_custom_request("querybypost", //VuGen中树形视图中显示的名称
"Url=http://192.168.3.33:9200/_search", //请求url
"Method=POST",
"Resource=0",
"Mode=HTTP", //请求方式
"Referer=",
"EncType=application/json", //指定响应头的Content-Type,这里是JSON
"RecContentType=application/json", //指定请求头的Content-Type,这里是JSON
"Body={\"query\":{\"bool\":{\"must\":[{\"term\":{\"plateNumNond\":\"
LAST);
lr_end_transaction("querybypost", LR_AUTO);
lr_output_message( "PlateNumNond on iteration #%s", lr_eval_string( "
}
4. 查看返回结果
Virtual User Script started at : 2016-09-21 16:40:04
Starting action vuser_init.
Web Turbo Replay of LoadRunner 11.0.0 for Windows 7; build 8859 (Aug 18 2010 20:14:31) [MsgId: MMSG-27143]
Run Mode: HTML [MsgId: MMSG-26000]
Run-Time Settings file: "F:\PassCarSearch\ESqueryByPlateNumNond_POST\\default.cfg" [MsgId: MMSG-27141]
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(6): Notify: Transaction "querybypost" started.
Action.c(9): Registering web_reg_find was successful [MsgId: MMSG-26390]
Action.c(14): Warning: The string '"plateNumNond":"B23456"' with parameter delimiters is not a parameter.
Action.c(14): Warning: The string '' with parameter delimiters is not a parameter.
Action.c(14): t=770ms: 87-byte response headers for "http://192.168.3.33:9200/_search" (RelFrameId=1, Internal ID=1)
Action.c(14): HTTP/1.1 200 OK\r\n
Action.c(14): Content-Type: application/json; charset=UTF-8\r\n
Action.c(14): Content-Length: 124\r\n
Action.c(14): \r\n
Action.c(14): t=808ms: 124-byte response body for "http://192.168.3.33:9200/_search" (RelFrameId=1, Internal ID=1)
Action.c(14): {"took":9,"timed_out":false,"_shards":{"total":40,"successful":40,"failed":0},"hits":{"tot
Action.c(14): al":0,"max_score":null,"hits":[]}}
Action.c(14): Error -26366: "Text=t_query_data" not found for web_reg_find [MsgId: MERR-26366]
Action.c(14): web_custom_request("querybypost") highest severity level was "ERROR", 124 body bytes, 87 header bytes [MsgId: MMSG-26388]
Action.c(14): Notify: Transaction "querybypost" ended with "Fail" status (Duration: 0.9686 Wasted Time: 0.7094).
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
报错了。返回结果中的提示是Warning: The string '"plateNumNond":"B23456"' with parameter delimiters is not a parameter.
突然想到在loadrunner中,参数化的标志是{},我在body里面的{}并不是参数化,而是json的格式。。。终于找到原因了,
接下来就简单了,只需在Tool - General Options - Parameterization 中将Parameter Braces 改为<>即可,如图
5. 重新运行,查看结果。 看到以下结果,ok,搞定,收工!
Virtual User Script started at : 2016-09-21 17:49:10
Starting action vuser_init.
Web Turbo Replay of LoadRunner 11.0.0 for Windows 7; build 8859 (Aug 18 2010 20:14:31) [MsgId: MMSG-27143]
Run Mode: HTML [MsgId: MMSG-26000]
Run-Time Settings file: "F:\PassCarSearch\ESqueryByPlateNumNond_POST\\default.cfg" [MsgId: MMSG-27141]
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(3): Notify: Transaction "querybypost" started.
Action.c(6): Registering web_reg_find was successful [MsgId: MMSG-26390]
Action.c(11): Notify: Parameter Substitution: parameter "PlateNumNond" = "鲁UTR294"
Action.c(11): t=1729ms: 87-byte response headers for "http://192.168.3.33:9200/_search" (RelFrameId=1, Internal ID=1)
Action.c(11): HTTP/1.1 200 OK\r\n
Action.c(11): Content-Type: application/json; charset=UTF-8\r\n
Action.c(11): Content-Length: 124\r\n
Action.c(11): \r\n
Action.c(11): t=1885ms: 124-byte response body for "http://192.168.3.33:9200/_search" (RelFrameId=1, Internal ID=1)
Action.c(11): {"took":2,"timed_out":false,"_shards":{"total":40,"successful":40,"failed":0},"hits":{"tot
Action.c(11): al":0,"max_score":null,"hits":[]}}
Action.c(11): Registered web_reg_find successful for "Text=max_score" (count=1) [MsgId: MMSG-26364]
Action.c(11): web_custom_request("querybypost") was successful, 124 body bytes, 87 header bytes [MsgId: MMSG-26386]
Action.c(22): Notify: Transaction "querybypost" ended with "Pass" status (Duration: 1.8611 Wasted Time: 0.6362).
Action.c(24): Notify: Parameter Substitution: parameter "PlateNumNond" = "鲁UTR294"
Action.c(24): PlateNumNond on iteration #鲁UTR294
Ending action Action.
Ending iteration 1.
jmeter接口测试
需要先安装JDK,并且配置环境变量
1.线程组,添加及介绍
首先需要添加线程组
①线程数:并发数量
② 指在某秒内启动,启线程,一般写0就行了
③循环次数:想要循环多少次就写多少
④调度器:使用时需要勾选循环次数的永远
2.HTTP请求,添加及介绍
在线程组下添加HTTP请求
①名称:随意更改,什么接口请求就可以改成什么名称
②服务器名称或IP:
IP例如130.162.3.108 需要填端口号
③方法:什么类型请求方法就选什么
⑤content enconding:中文时填入utf-8,有助于识别中文乱码、???等情况
⑥parameters:写参数用
⑦body data:入参是json类型时在此输入
⑧files upload:传输文件用
3.查看结果树,查看返回结果用的,可以放在线程组下,也可以放在http请求下
4.HTTP请求-操作
①简单参数,get请求方法
②简单参数,post请求方法
③post请求方法,入参类型为json
④需要cookie,在请求下添加,
名称:用户名
值:接口签名
域:请求里的服务器名称
⑤添加header
信息
⑥上传文件
5.关联(正则表达式、jp@gc - JSON Path Extractor)
①jp@gc - JSON Path Extractor使用方法
名字随意起
jsonpath expression:一级一级写,用“.”分割,开头$,如图
替换的值就为${sign}
②正则表达式
名字,缺省值随意起,缺省值可为空
模板匹配数字固定格式
其中“(.*)”用来匹配任意长度的除换行符以外的字符
替换的值就为${123}
6.参数化
①CSV Data Set Config
filename:文件路径,win10,放在bin目录下
variable names:名字随意,多个元素用逗号隔开
belimiter:多列时用什么符号分隔
recycle:是否要循环读取
stop thread:参数文件读取完是否继续执行
sharing mode:1.all threads在所有的线程组生效,2.current thread group:当先线程组生效
②函数助手对话框
${__time(yyyyMMddHHmmSS,)}
生成的加入参数值中
③用户定义的变量
名称随意
值为想要替换的数据
替换的值就为${123}
7.连接数据库
①在测试计划下添加数据库连接驱动包
②添加JDBC连接配置
JDBC连接配置与JDBC请求名称要一致
③添加JDBC请求,添加后可直接进行数据库操作
callable:可以用增删改查
select:只能做查
8.断言
9.中文乱码的解决方法
① 当响应数据或响应页面没有设置编码时,jmeter会按照jmeter.properties文件中,sampleresult.default.encoding设置的格式解析
test格式打开jmeter.properties,搜索sampleresult.default.encoding,改为UTF-8,并去掉#
②请求中的content encoding填入UTF-8
③数据库URL后加&characterEncoding=UTF-8
10添加监听器
方便查看运行后的结果
11、查看“聚合报告”
- Label: 定义的HTTP请求名称
- Samples: 表示这次测试中一共发出了多少个请求
- Average: 访问页面的平均响应时间
- Median:访问页面的中位数响应时间
- 90% Line:访问页面的90%响应时间
- 95% Line:访问页面的95%响应时间
- 99% Line:访问页面的99%响应时间
- Min: 访问页面的最小响应时间
- Max: 访问页面的最大响应时间
- Error%: 错误的请求的数量/请求的总数
- Throughput:每秒完成的请求数
- KB/Sec: 每秒从服务器端接收到的数据量
关于90% Line:
一组数由小到大进行排列,找到他的第90%个数(假如是12),那么这个数组中有90%的数将小于等于12 。
用在性能测试的响应时间也将非常有意义,也就是90%请求响应时间不会超过12 秒。
上述步骤完成了一个简单测试案例的创建,复杂测试案例均在此基础上扩展完成。
使用Jmeter工具开发的接口测试案例,一个子系统建议放在同一个 “测试计划”中,流程测试可以通过“线程组”来区分,这样也便于设定不同的测试数据个数。
比较独立的接口,可以统一放在一个线程组内,顺序完成测试。
SoapUI接口测试---soap
SoapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。该工具既可作为一个单独的测试软件使用,也可利用插件集成到Eclipse,maven2.X,Netbeans 和intellij中使用。SoapUI可以快速创建和执行自动化功能、回归、合规和负载测试。SoapUI 基于Java 开发,支持多个平台,安装非常简单。SoapUI是开源版,SoapUI Pro是商业非开源版本。
SoapUI工具常用做两种请求接口的测试,分别是get请求和post请求。
soapui是接口测试工具,SoapUI还可以对web service进行功能上和性能上的测试。工具安装很简单, 使用步骤主要包括:新建项目,添加测试套件、测试用例、修改参数、运行、添加断言
使用SoapUI进行接口测试一般不需要自己去拼报文,通常会给webservice的地址或者导入wsdl文件, SoapUI即可获取到webservice里的所有接口和报文,再直接填入参数调用,能看到返回报文就行了
SoapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。该工具既可作为一个单独的测试软件使用,也可利用插件集成到Eclipse,maven2.X,Netbeans 和intellij中使用。
SoapUI是一个自由和开放源码的跨平台功能测试解决方案。通过一个易于使用的图形界面和企业级功能,SoapUI让您轻松, 快速创建和执行自动化功能、回归、合规和负载测试。在一个测试环境,SoapUI提供完整的测试覆盖,并支持所有的标准协议和技术。
SoapUI 基于Java 开发,支持多个平台,安装非常简单。
SoapUI下载地址:https://www.soapui.org/,下载开源版SoapUI,SoapUI Pro是SoapUI的商业非开源版本
构建项目
1.打开SoapUI软件>File>New SOAP Project,新建工程
2. Project Name 名称随意,WSDL填入webservice的地址或者导入wsdl文件,本例使用的接口是中国电视节目表WEB服务
,WSDL地址为:http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl。
构选上“Create Requests”项目会根据WSDL文件自动创建接口请求文件;构选上“Create TestSuite”就会给WSDL创建一个测试套件
3.点击OK后就已经创建好一个工程了,自动添加WSDL里面有的接口,根据Soap 的版本不同提供了两种接口,如下图所示:
接口业务:
getAreaDataSet:获得支持的省市(地区) 和分类电视列表
getTVstationDataSet:通过省市ID 或分类电视ID 获得电视台列表
getTVchannelDataSet :通过电视台ID 获得该电视台频道列表
getTVprogramDataSet : 通过频道ID 获得该频道节目列表
以上4个接口除getAreaDataSet接口不需要入参,其余三个接口是需要输入参数的,接口getTVstationDataSet的请求中“?”表示要入参,如下图所示:
若不入参,运行会出现如下所示错误信息:
运行单个请求
1.选择getAreaDataSet下的Request1,双击,点击运行按钮,就会出现右侧面板中的结果,获得到支持的省市(地区) 和分类电视列表,如下图所示:
2.选择getTVstationDataSet下的Request1,双击,把中间面板中的?替换成省市ID(areaID),点击运行按钮就会出现右侧面板中的结果,获得电视台列表,如下图所示:
3.选择getTVchannelDataSet 下的Request1,双击,把中间面板中的?替换成电视台ID(tvStationID),点击运行按钮,就会出现右侧面板中的结果,获得频道列表,如下图所示:
4.选择getTVprogramDataSet 下的Request1,双击,把中间面板中的?替换成频道ID(tvChannelID),点击运行按钮,就会出现右侧面板中的结果,获得该频道节目列表
构建测试用例
当创建好project并且导入了WSDL后,我们就可以开始创建测试用例以便开展测试了。SoapUI有多种方法添加测试用例,且可以通过Groovy或者javaScript脚本来增强脚本的功能。
1.创建测试套件:选择项目“CTV”右键点击“New TestSuite”,可输入测试名(TestSuite 1),如下图所示
2.创建测试用例Test case,选择测试套件“TestSuite 1”右键点击“New TestCase”,如下图所示:
创建好之后,新建的TestCase中包含三个部分:
测试步骤:Test Steos
负载测试:Load Tests
安全测试:Security Tests
3.把请求添加到测试用例中:选择一个请求,然后右键点击“Add to TestCase”,然后在弹出窗口中选择我们刚才新建的"TestSuite 1"即可,如下图所示:
这样就已经创建好了一条测试用例,如下图所示:
4.运行测试:打开TestCase窗口,点击绿色运行按钮即可,绿色表示运行成功,运行结果在右面板下方,如下图所示:
5.增加检查点
①在测试步骤中打开服务求请求,如下图所示:
soapUI的assertion类型有
类型 |
说明 |
Schema Compliance |
|
Contains |
检查是否存在特定字符串 |
Not Contains |
检查是否不存在特定字符串 |
SOAP Fault |
|
Not SOAP Fault |
|
SOAP Response |
|
Response SLA |
检查响应时间与指定的值 |
XPath Match |
Xpath 表达式的结果是否是期望值 |
XQuery Match |
将XQuery表达式的结果与预期值进行比较 |
Script Assertion |
自己写脚本判断 |
WS-Security Status |
|
WS-Addressing Response |
|
WS-Addressing Request |
|
②点击+号,添加检查点,选择Recently used>Contains>Add,如下图所示:
③输入检查的内容,如下图所示:
④然后运行服务请求,在“Assertions”窗口中可以看到“Contains - VALID”说明检查点是有效的,如下图所示:
接口之间传递参数
getAreaDataSet:获得支持的省市(地区) 和分类电视列表
getTVstationDataSet:通过省市ID 或分类电视ID 获得电视台列表
getTVchannelDataSet :通过电视台ID 获得该电视台频道列表
getTVprogramDataSet : 通过频道ID 获得该频道节目列表
依次加入到TestCase 1 的测试步骤中去,然后组织测试获取“湖南金鹰卡通”的节目列表,具体的测试步骤为:
①获得“湖南省”的分类ID “18 ”
②获取“湖南省”类别中的“湖南电视台”ID :“98 ”
③获取“湖南电视台”的频道“湖南金鹰卡通 ”ID :“292 ”
④获取“湖南金鹰卡通”频道的节目列表
1.先将请求依次添加到用例中,如下图所示:
2.添加入参操作,用于两个服务请求接口间的交互,如下图所示:
将服务请求getAreaDataSet 结果中的“湖南省”ID“18 ”作为服务请求getTVstationDataSet 入参
创建好之后,双击,弹出如下图所示界面,输入参数值:
右侧面板上部分中输入如下代码,其中//并不是注释,只是表相对路径,(getAreaDataSet 结果)
declare namespace diffgr="urn:schemas-microsoft-com:xml-diffgram-v1";
//diffgr:diffgram/Area/AreaList[22]/areaID[1]
右侧面板下部分中输入如下代码(getTVstationDataSet 入参)
declare namespace web="http://WebXml.com.cn/";
//web:getTVstationDataSet/web:theAreaID[1]
点击运行,即可看到是否成功,成功如下图所示:
获取上述代码的方法:
上半部分从getAreaDataSet的返回参数中获取:
下半部分从getTVstationDataSet的入参中获取:
其它两个交互方法一样,稍微更改即可。
将服务请求getTVstationDataSet结果中的“湖南电视台”ID“98 ”作为服务请求getTVchannelDataSet入参
右侧面板上部分中输入如下代码(getTVstationDataSet 结果)
declare namespace diffgr="urn:schemas-microsoft-com:xml-diffgram-v1";
//diffgr:diffgram/Station/TvStation[5]/tvStationID[1]
右侧面板下部分中输入如下代码(getTVchannelDataSet 入参)
declare namespace web="http://WebXml.com.cn/";
//web:getTVchannelDataSet/web:theTVstationID[1]
获取上述代码的方法:
上半部分从getTVstationDataSet的返回参数中获取:
下半部分从getTVchannelDataSet的入参中获取:
将服务请求getTVchannelDataSet 结果中的“湖南金鹰卡通”ID“292 ”作为服务请求getTVprogramDataSet 入参
右侧面板上部分中输入如下代码(getTVchannelDataSet结果)
declare namespace diffgr="urn:schemas-microsoft-com:xml-diffgram-v1";
//diffgr:diffgram/Channe/TvChanne[4]/tvChannelID[1]
右侧面板下部分中输入如下代码(getTVprogramDataSet入参)
declare namespace web="http://WebXml.com.cn/";
//web:getTVprogramDateSet/web:theTVchannelID[1]
获取上述代码的方法:
上半部分从getTVchannelDataSet返回参数中获取:
下半部分从getTVprogramDataSet的入参中获取:
运行测试
1.整个测试步骤设置好之后,打开“TestCase 1”运行测试,全部绿色表示测试通过,如下图所示:
2.在TestCase Log中还可以看到接口之间传递的参数值,如下图所示:
3.运行结束后,再打开接口请求,可以看到请求显示的就是所传递的值,如下图所示:
4.还可以在请求中设置检查点,来检查是否通过,检查点的设置方法已在构建测试用例中介绍
get请求
在使用SoapUI工具进行接口测试时,三个步骤是必然,那就是先新建SOAP工程,然后在新建的工程中构建测试套件,再然后在构建的测试套件中构建测试用例。首先把上述三步做好,效果如下图所示:
接下来在构建的测试用例中新建用例,右键Test Steps>Add Step>HTTP Request,具体操作如下所示:
新建HTTP Request请求时,会弹出一个输入请求名的框,可自己输入请求名也可使用默认,确认后弹出对话框,本例中get请求用到的接口为豆瓣的图书接口:https://developers.douban.com/wiki/?title=book_v2#get_book 。
所以,在Endpoint中填入接口该地址,在Parameters中点+号写入Name和Value,在Method中选择该请求的请求方式,最后点击OK即可。
点击运行此请求,得到如下所示结果,需要注意的是,由于实例中接口返回的数据是JSON类型,所以要在JSON中查看。
返回的结果,可以复制到JSON解析器中解析,可以更清晰明了的查看(www.bejson.com)
post请求
本利中post请求接口使用的是禅道登录接口:http://127.0.0.1:81/zentao/user-login.html,添加post请求步骤跟上面添加get请求步骤差不多,只是参数设置不同而已,设置界面如下图所示:
在Endpoint中填入接口的地址,在Parameters中点+号写入Name和Value,在Method中选择该请求的请求方式,最后点击OK即可。
运行post请求,运行结果如下图所示:
soapui功能测试基础
自带webservice实例学习
soapUI为我们做了一个webservice的实例,并且利用soapUI的webservice模拟功能(MockService)为我们学习soapUI提供了方便。我们用的是C:\Users\具体的用户目录\SoapUI-Tutorials\Sample-SOAP-Project-soapui-project.xml。同时soapui有一个官方的教程来指导学习http://www.soapui.org/Getting-Started/web-service-sample-project.html
1.在Project上右键选择“Import Project”
2. 再弹出的选择框中浏览选择sample-soapui-pro-project.xml
3. 完成后的显示结果
4. 展开SoapBinding
从这里我们可以看到这个服务有4个Request。分别点击后能看到不同request的不同参数。
请求 |
参数 |
返回/说明 |
login |
Username Password |
Sessionid |
logout |
Sessionid |
Sessionid销毁 |
search |
Sessionid Searchstring |
Searchstring的范围: Item 1 / Item 2 /Item 3/Item 4 Item 5 / all |
buy |
Sessionid buystring |
Buystring和searchstring一样 |
在学习中利用这个服务时,可以分别点击以上的请求自己试试看。在执行前,一定要运行MockService
创建MockService
1. 创建soap project,wsdl使用: http://localhost:7890/axis2/services/HelloWorld?wsdl
2. 创建MockService,选择一个soap右键选择Generate SOAP MockService
创建好后就如下
3. 编写MockService的Response,也就是修改Response (其实说白了,做模拟就是模拟返回值,输入的参数我们当然是知道的)
将?改为一个模拟的返回值,例如我们这里改为“Bill says it is good”
4. 创建一个Request 名称为:MockRequest ,
并且关闭tomcat(为了看出是MockService在起作用,而不是原来真实的webservice起作用),启动MockService后执行MockRequest
因为这里没有用到name这个参数做任何的事情,所以无论在name参数中输入什么,都返回“Bill says it's good”
有关MockService的功能,官方网站上讲的很多,这里只是了解一下而已,我想除非是真正大量测试Webservice,否则对soapUI基础功能有所了解就能应付一般的webservice测试需要了吧。
soapUI测试用例
1、测试数据单一
1)新建测试套件:
增加断言:
运行结果:
2、测试数据来源于excel:
1)创建测试数据文件:testaccept.xlsx
2)选择测试步骤,添加【Datasource】
3)添加请求:
4)添加DataSource Loop,又来控制循环取数
5)增加断言:
6)运行结果
我们看到测试用例执行失败后,后面的将不会执行,而我们希望即使失败也要执行所有的测试用例,我们做如下设置:取消Abor test if an fasiled TestSteps前面的钩,再运行:
7)查看测试结果信息:
8)导出测试报告
soapUI性能测试
1、创建性能测试用例:
2)点击运行,运行结果如下:
4)生成性能测试统计图
应对接口地址变化
如果是没有代码能力的小白,要利用工具进行接口测试的时候,经常会遇到接口地址或者接口参数变化的问题,然后不得不在他们改了接口之后,就手动去改所有的请求链接地址和接口参数!1-5个请求,我们手动改还应付的过来!要是10多20个,我感觉内心是非常奔溃的!所以今天就特意教大家一招,防范于未然!也是做测试必须要遵守的一点:从细节做起。
Step1:导入一个项目,并点击这个项目,在公共属性模块下面,设置一个公用参数,如下图所示:
当然,这里也只是一个参数而已,你随便取什么名字都可以!但是后面这个value,一定要记住是你接口请求的IP地址和端口号!
Step2:然后点击你项目的内容,就是绿色漏斗形状的项目,双击它:
然后就会弹出一个对话,框,选中Service Endpoints这个tab项,然后看下面的第三步。
Step3:编辑你的引用,如下所示:
在这里不得不提示2点“
1)有的同学经常是在第一步的参数里面,设置URL写的是这种: http://192.168.1.14:19020,自带了 http://,然后这里引用的时候,又重复的有这个http://,所以就会报错! 因为拼接起来的地址就变成了:
http://http://192.168.1.14:19020.....这样肯定是访问失败的!
2)还有同学在引用这个URL的时候,会经常忘记前面的#号,然后就是这样的:
,也死活访问不成功!那是因为你根本没有引用正确IP地址!所以大家一定要仔细细心,该有的不能少,不该有的要去掉!
Step4:下面来看看效果
大家可以看到你对应的请求里面,地址都是引用形式的,不管是改IP地址还是接口还是改参数,再也不用一个一个去改了!你只需要动动手指,把最开始设置参数的地方,也就是第一步那里,改下参数对应的IP地址就好啦!