LoadRunner针对SOAP和RESTful这两种Web服务进行性能测试,协议选择、脚本开发思路完全不同。
SOAP Web Services (基于XML/SOAP/WSDL):LoadRunner首选协议Web Services 协议,soap_request 或可视化Service Call,通过导入WSDL文件自动生成调用框架,自动生成结构严谨的XML SOAP报文,对XML节点值进行参数化,从结构化的XML响应中提取数据。
RESTful API (通常基于HTTP/JSON):LoadRunner首选协议Web (HTTP/HTML) 协议,web_custom_request, web_url, web_submit_data等,通过录制HTTP流量或手动编写HTTP请求,需手动或参数化构建JSON/XML/文本报文,对URL、请求头、请求体进行参数化,从JSON、XML或文本响应中提取数据。
两种服务的测试方法说明:
如何测试 SOAP Web Services
SOAP协议规范、结构严谨,LoadRunner的Web Services协议能很好地支持。
1. 协议选择和脚本创建
启动VuGen,选择New Single Protocol Script (单协议脚本),在协议列表中选择Web Services。这是专门为基于WSDL的Web服务设计的协议,能自动解析接口定义。
2. 导入服务和生成脚本
点击 Manage Services -> Import。
在弹出窗口中,选择 URL,输入完整的WSDL地址(例如 http://zmtests.com/service?wsdl),点击 Import。
导入成功后,点击 Add Service Call,在弹出的界面中选择已导入的服务、端口和要测试的操作(Operation)。
在参数编辑界面,可以为每个输入参数设置具体的值,或选择 Auto Generate 自动生成。
点击确定,VuGen会自动生成一个包含 soap_request 函数调用的脚本。该函数会构建一个符合标准的SOAP信封(Envelope),无需手动拼接复杂的XML。
3. 脚本示例和优化
生成的脚本部分如下:
c
soap_request("StepName=MySOAPCall",
"URL=http://zmtests.com/WebService.asmx",
"SOAPEnvelope="
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<soap:Envelope ...>"
" <soap:Body>"
" <GetUserInfo xmlns=\"http://zmtests.com/\">"
" <UserId>{Parameter_UserId}</UserId>" // 参数化部分
" </GetUserInfo>"
" </soap:Body>"
"</soap:Envelope>",
"SOAPAction=http://zmtests.com/GetUserInfo",
"ResponseParam=response",
LAST);
参数化:将XML中的具体值(如 {Parameter_UserId})替换为参数,以实现不同用户使用不同数据。
关联:如果需要从响应中提取动态数据(如会话标识),可使用 web_reg_save_param_ex 等函数捕获XML响应中的特定节点值。
认证:若服务需要认证,可在请求前使用 web_set_user 设置用户名密码。
如何测试RESTful API
RESTful API基于HTTP协议,更灵活,通常使用JSON格式,因此选用通用的Web (HTTP/HTML) 协议来模拟。
1. 协议选择和脚本创建
在VuGen中创建新脚本,选择 Web (HTTP/HTML) 协议。这是最常用、最通用的协议,能够模拟所有基于HTTP的交互。
2. 脚本生成方式
推荐方式(手动编写/复制):使用web_custom_request函数。这个函数自由度极高,可以完全自定义请求方法、URL、请求头和请求体。可以直接从开发人员提供的API文档、或通过工具(如Postman)复制出原始的HTTP请求,稍加修改后嵌入这个函数。
辅助方式(录制):如果API有对应的网页前端,可以通过浏览器操作进行录制。但纯API调用通常手动编写更高效。
3. 脚本和优化
测试JSON格式REST API的脚本如下:
c
lr_start_transaction("api_post_user");
// 设置请求头,表明发送和接收JSON
web_add_header("Content-Type", "application/json");
web_add_header("Accept", "application/json");
// 发起自定义请求
web_custom_request("create_user",
"URL=http://api.zmtests.com/users",
"Method=POST",
"Body={\"name\": \"{Name}\", \"job\": \"{Job}\"}", // 请求体参数化
LAST);
lr_end_transaction("api_post_user", LR_AUTO);
参数化:对URL路径、查询参数、请求体(JSON串)中的值进行参数化。对于复杂的动态数据(如从数据库实时获取),可结合 lr_db_connect、lr_db_executeSQLStatement 等数据库函数实现。
关联:从JSON响应中提取数据,使用 web_reg_save_param_ex 并配合 "LB/UB" 或正则表达式来捕获值。
事务与集合点:使用 lr_start_transaction 和 lr_end_transaction 标记要监控的业务操作,使用 lr_rendezvous 设置集合点模拟瞬间高并发。
测试总结
无论是测试SOAP还是RESTful服务,以下原则都通用:
深入了解了系统:开始测试前必须向开发人员确认服务使用的准确协议和数据格式。
从单用户调试开始:保证单个虚拟用户的脚本能成功回放,再进行并发测试。
加入检查点:使用web_reg_find等函数验证返回结果中是否包含关键文本,保证业务逻辑正确。
模拟真实场景:通过参数化、使用不同的测试数据,避免因缓存导致的性能假象。
资源管理:像数据库连接这类资源,应在vuser_init中建立,在vuser_end中释放。
SOAP服务测试是利用Web Services协议和WSDL,实现高度自动化的脚本生成;而RESTful API测试则更依赖对HTTP协议和Web (HTTP/HTML)协议下函数的灵活运用。