Postman&Jmeter&SoapUI

一 简介

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

image_thumb8[1]

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

请求前需要执行的脚本可以放置在这里。主要进行一些环境以及全局变量的设置。

image_thumb10

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。

image_thumb12

2.8 code

可以将当前的请求以代码的方式导出来。默认是python3。

 

三 响应

保证API响应的正确性,就是你需要做的大部分工作。postman的response视图部分可以进行查看。一个API的响应包含body、headers、响应状态码。postman将body和headers放在不同的tabs中。响应码和响应时间显示在tabs的旁边。将鼠标悬停在响应码上面可以查看更详细的信息。

查看responses

 

三种视图查看body

 

Pretty格式化了JSON和XML,方便查看。 点击里面的URL,postman会创建一个request:

点击左边的三角可以折叠展开:

 

Raw 是text,不会进行任何高亮显示

Preview 有的浏览器会返回HTML的错误,对于找问题比较方便。

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

  请求报文格式:

<?xml version="1.0" encoding="ISO-8859-1"?>
< Publish >
<SNSID>123</SNSID>
<UserID>456</ UserID>
<CommentsTypeID>2</ CommentsTypeID>
<CommentsID>123</CommentsID>
<AuthorID>456</AuthorID>
<CommentsContent>Don't forget the meeting!</CommentsContent>
</Publish>

  应答报文的参数接口说明:

参数名称

参数描述

字符类型

字符值

UserID

用户ID

String

10

CommentsTypeID

评论类型ID

String

2

CommentsID

评论ID

String

10

CommentsContent

评论内容

String

50

StatusCode

返回值

Int

0代表pass,非0代表fail

StatusText

返回信息描述

String

<?xml version="1.0" encoding="ISO-8859-1"?>
< Publish >
<UserID>456</ UserID>
<CommentsTypeID>2</ CommentsTypeID>
<CommentsID>123</CommentsID>
<CommentsContent>Don't forget the meeting!</CommentsContent>
<StatusCode>0</StatusCode>
<StatusText>发送成功一条评论</StatusText>
</Publish>

LoadRunner中涉及到向服务器发送请求的API方法包括:web_url(),web_submit_form(),web_submit_data(),web_custom_request()。下面介绍两种我常用的方法:

方法一:使用web_submit_data()

web_submit_data("insert",
      "Action=http://116.211.23.123/SNS/Publish.htm ",
      "Method=POST",      
"Referer=http://116.211.23.123/SNS/Publish.htm ",
       "Mode=HTML",
      ITEMDATA,
      "Name= SNSID ","Value=6601",ENDITEM,
      "Name= UserID ","Value=123",ENDITEM,
      "Name= CommentsTypeID ","Value=1",ENDITEM,
      "Name= CommentsID ","Value=456",ENDITEM,
       "Name= AuthorID","Value=789",ENDITEM,
       "Name= CommentsContent ","Value=Just for testing",ENDITEM,
               LAST);

方法二:使用web_custom_request()

char str[1000];
strcpy(str,"SNSID=7999&UserID=1&CommentsTypeID=1&CommentsID=1&AuthorID=1&CommentsContent=1");
web_custom_request("Publish",
                  "Url= http://116.211.23.123/SNS/Publish.htm",
                  "Method=POST",
                  "Referer=http://116.211.23.123/SNS/Publish.htm ",
                  "Mode=HTTP",
                  str,
                  LAST);

  

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=<StatusCode>0</StatusCode>",//应答报文里边的信息
"SaveCount= StatusCodeCount", //统计查询字段的信息,如果找到值为1,如果未找到值为0
LAST);

  在脚本的最后我们可以对查询字段的信息进行统计

// Check result
if (atoi(lr_eval_string("{StatusCodeCount }")) > 0){ //判断如果Welcome字符串出现次//数大于0
lr_output_message("Send out the comment successfully."); }//在日志中输出Send out //the comment successfully
 
else{ //如果出现次数小于等于
 
lr_error_message("Send out the comment unsuccessfully."); //在日志中输出Send out //the comment successfully
return(0);
}

 

 

业务场景是在客户端根据具体车牌查询相关车辆信息,结果返回前10条记录。接口的请求参数和返回结果均是JSON字符串,请求可以用POST或者GET方法。先说GET方法:

一、GET方法测试

  1. Insert - New step -选择Custom Request - web_url
  2. 填入相应参数
  3. 生成脚本,并修改如下

 

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.

 

说明:

  1. 返回结果中可以看到检查点和事务都成功了,表明我们的脚本编写无误。
  2. 查看服务器返回的结果需在Vuser-Runtime-settings的log选项下,勾选Enable-logging、Extended log、Data returned by server 。

 

二、POST方法测试

 在用POST方法创建脚本时遇到了点波折——先是使用了函数web_submit_date,执行时报错,查询资料没找到原因,不知道是不是该函数不支持JSON串,有兴趣的可以自己试下。然后尝试用web_custom_request函数,执行后返回的结果都正确,ok,就它了。

  1. Insert - New step -选择Custom Request - web_custom_request
  2. 填入相应参数
  3. 生成脚本,并修改如下(参数中的引号"前需要加斜杠\转译)

 

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\":\"<PlateNumNond>\"}}],\"must_not\":[],\"should\":[]}},\"from\":0,\"size\":10,\"sort\":[],\"aggs\":{}}:",    //body的内容

         LAST);

    lr_end_transaction("querybypost", LR_AUTO);

    lr_output_message( "PlateNumNond on iteration #%s", lr_eval_string( "<PlateNumNond>" ) );

}

 

   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)点击运行,运行结果如下:

3)参数设置说明:

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地址就好啦!

猜你喜欢

转载自www.cnblogs.com/tester-l/p/10150295.html