前言
对比接口测试工具SoapUI、Jmeter、Postman、LoadRunner,更深入了解工具使用的区别,以及接口测试的原理。
本次使用的接口测试数据如下所示:
接口协议:Soap协议
请求报文:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://192.168.23.203:8080/dmc/services/commonCall">
<soapenv:Header/>
<soapenv:Body>
<com:query soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<opt xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">{"ServiceID":"model","first":"黑龙江省","second":"大庆市"}</opt>
</com:query>
</soapenv:Body>
</soapenv:Envelope>
返回报文:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:queryResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://192.168.23.203:8080/dmc/services/commonCall">
<queryReturn soapenc:arrayType="soapenc:string[][1]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<queryReturn soapenc:arrayType="soapenc:string[4]" xsi:type="soapenc:Array">
<queryReturn xsi:type="soapenc:string">SUCCESS</queryReturn>
<queryReturn xsi:type="soapenc:string">a6dae0f8502b431eba2c8688973faf44</queryReturn>
<queryReturn xsi:type="soapenc:string" xsi:nil="true"/>
<queryReturn xsi:type="soapenc:string" xsi:nil="true"/></queryReturn>
</queryReturn>
</ns1:queryResponse>
</soapenv:Body>
</soapenv:Envelope>
一、SoapUI
若只是测试单个接口,新建工程时直接输入WSDL地址,建完会有一个默认SOAP请求,直接发送报文执行即可。
整体规范操作流程:新建工程》新建测试用例集》新建测试用例》新建测试步骤创建请求
1、新建工程
操作步骤:打开软件SoapUI 5.2.1,File>New SOAP Project,输入工程名称,点击【OK】
2、新建测试用例集
操作步骤:右击工程名称,选择New TestSuite,输入测试用例集名称
3、新建测试用例
操作步骤:右击测试用例集,选择New TestCase,输入测试用例名称
4、新建测试步骤创建请求
操作步骤:右击测试用例,Add Step>SOAP Request,输入步骤名称
创建完成后的界面如下,输入请求报文,点击执行按钮即可完成接口请求:
二、Jmeter
整体流程:创建测试计划》创建线程组》创建HTTP请求》创建查看结果树》执行接口请求》结果树查看执行结果
1、创建测试计划
操作步骤:打开Jmeter软件(4.0版本),点击菜单栏File>New即可出现TestPlan
2、创建线程组
操作步骤:右击测试计划,Add>Threads(Users)>Thread Group
3、创建HTTP请求
操作步骤:右击线程组名称,选择Add>Sampler>HTTP Request,配置请求内容
4、创建查看结果树
操作步骤:右击线程组名称,选择Add>Listener>View Results Tree
5、执行接口请求
操作步骤:点击菜单栏的执行按钮
6、结果树查看执行结果
请求结果是失败的,但是soapui执行是成功的,这时可以通过抓包工具fiddler,分析两个请求内容的差异,最终定位是由于soapui会自动加入请求头内容,而jmeter需要手动加入,右击线程组名称,选择Add>Config Element>HTTP Header Manager
请求失败结果如下:
Fiddler抓包信息,如下图所示:
注意事项:fiddler抓包时相应工具需要做代理,如SOAPUI点击菜单栏的Proxy进行代理设置。
加入请求头,如下图所示:
重新发送请求,请求结果是成功的,如下图所示:
三、POSTMAN
整体流程:创建请求,发送请求
1、创建请求,发送请求
操作步骤:点击+,配置请求信息:请求行(包括:请求方式,请求URL),请求报文(包括:请求头,请求正文)
四、LoadRunner
1、创建协议脚本,进行脚本开发
操作步骤:选择HTTP协议创建即可,然后进行脚本开发
脚本内容,如下所示:
Action()
{
web_add_header("SOAPAction","\"\"");
lr_convert_string_encoding("黑龙江省",LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"users1");
lr_convert_string_encoding("大庆市",LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"users2");
lr_save_string(lr_eval_string("{users}"),"user1");
lr_save_string(lr_eval_string("{users}"),"user2");
lr_start_transaction("dmc");
web_reg_save_param("body",
"LB=",
"RB=",
LAST);
web_reg_find("Fail=NotFound",
"Search=Body",
"SaveCount=code",
"Text=SUCCESS",
LAST);
web_custom_request("xxcx",
"URL=http://192.168.23.203:8080/dmc/services/commonCall?wsdl",
"Method=POST",
"TargetFrame=",
"Resource=0",
"RecContentType=",
"Referer=",
"Mode=HTTP",
"EncType=text/xml;charset=UTF-8",
"Body=<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:com=\"http://192.168.23.203:8080/dmc/services/commonCall\">"
"<soapenv:Header/>"
"<soapenv:Body>"
"<com:query soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
"<opt xsi:type=\"xsd:string\" xs:type=\"type:string\" xmlns:xs=\"http://www.w3.org/2000/XMLSchema-instance\">{\"ServiceID\":\"model\",\"first\":\"{user1}\",\"second\":\"{user2}\"}</opt>"
"</com:query>"
"<opt xs:type=\"type:string\" xmlns:xs=\"http://www.w3.org/2000/XMLSchema-instance\"/></soapenv:Body>"
"</soapenv:Envelope>",
LAST);
if(atoi(lr_eval_string("{code}")) > 0)
{
lr_end_transaction("dmc", LR_PASS);
}else{
lr_end_transaction("dmc", LR_FAIL);
}
lr_output_message(lr_eval_string("{body}"));
return 0;
}
五、总结
接口的本质就是发送请求报文给服务器,然后服务器返回响应报文。我们对响应报文进行分析,判断是否和我们发给服务器的请求对应的返回报文相同,从而验证业务是否正确实现,这即是接口测试。
请求报文由请求行、请求头、请求正文三部分组成,响应报文由状态行、响应报头、响应正文三部分组成。
通过这几种工具对比,可以发现工具之间的差异是在操作方面的不同,原理方面都是一样的,都是发送请求报文,验证返回报文正确性。
综上,工具的选择可以根据自己掌握的熟练程度和使用目的来选择最优的工具。