SoapUI 传递 JSON 串:从基础到高级实践指南
在现代 API 测试中,JSON(JavaScript Object Notation)已成为数据交换的主流格式,SoapUI 作为一款强大的 API 测试工具,支持灵活地发送和接收 JSON 数据,本文将详细介绍如何在 SoapUI 中传递 JSON 串,从基础设置到高级技巧,助您高效完成 API 测试任务。
准备工作:创建测试请求并设置方法
在传递 JSON 串之前,确保您已经:
- 创建了 SoapUI 项目:指向您要测试的 API 的 WSDL 或 REST API 的 URL。
- 添加了测试请求:
- 对于 REST API:在项目的 "REST" 部分右键点击资源,选择 "New Request",输入请求名称(如 "CreateUser")。
- 对于 SOAP API:虽然 SOAP 通常使用 XML,但某些 SOAP 服务的 Header 或 Body 可能会包含 JSON 数据(通过 MTOM 附件或特定扩展),本文主要聚焦 REST API 的 JSON 传递,SOAP API 中若有类似需求可参考类似思路,但需注意数据格式转换。
在 REST 请求中直接传递 JSON 串
这是最常见的方式,通常用于 POST、PUT、PATCH 等请求方法,用于提交请求体数据。
-
打开请求编辑器:双击您刚才创建的 REST 请求(如 "CreateUser"),打开请求编辑窗口。
-
选择 "Request Body" 选项卡:在请求编辑器的下方,找到并点击 "Request Body" 选项卡。
-
选择 "JSON" 单选按钮:默认可能是 "None" 或 "XML",请选择 "JSON"。
-
输入 JSON 数据:在下方的文本框中,直接输入您的 JSON 字符串,创建一个用户的 JSON 数据:
{ "username": "testuser123", "email": "testuser@example.com", "password": "SecurePassword123!", "age": 30 }注意:
- 确保您的 JSON 格式正确,使用双引号,注意逗号和大括号的匹配。
- SoapUI 会尝试对 JSON 进行语法高亮和简单验证,如果有明显错误会提示。
-
设置请求方法(如果尚未设置):在请求编辑器的顶部,确保请求方法(如 POST、PUT)正确,对于包含 JSON 体的请求,POST 用于创建资源,PUT 用于更新资源。
-
添加必要的 Headers:许多 API 要求在请求头中指定
Content-Type为application/json,在 "Request Headers" 部分(通常在 "Request Body" 选项卡旁边或上方),点击 "Add" 按钮,输入:- Name:
Content-Type - Value:
application/json
API 需要认证(如 API Key、Bearer Token),也请在此添加相应的请求头。
- Name:
-
发送请求:点击绿色的 "Run" 按钮(或使用快捷键 F8),SoapUI 会将您设置的 JSON 数据作为请求体发送出去,并在 "Response" 选项卡中显示服务器返回的响应。
使用 Properties 或 DataSource 动态传递 JSON 串
在实际测试中,JSON 数据往往是动态的,例如从数据库读取、从上一个请求的响应中获取,或者使用变量来控制,SoapUI 提供了多种方式实现动态 JSON。
-
使用 Properties/Variables:
- 定义变量:在 SoapUI 的 "Script" 选项卡(或通过
TestRunner的testRunner.testCase.getPropertyValue()/testRunner.testCase.setPropertyValue())或直接在 "Properties" 窗口(通常在左侧)中定义变量,username= "dynamicUser"email= "dynamic@example.com"
- 在 JSON 中引用变量:在 "Request Body" 的 JSON 文本中,使用
${variableName}的语法来引用变量,SoapUI 会在发送请求时自动替换这些占位符。
{ "username": "${username}", "email": "${email}", "password": "AnotherSecurePassword!", "age": 25 }- 通过脚本设置变量:可以在 "Script" 选项卡中使用 Groovy 脚本动态设置变量值,然后再在 JSON 中引用。
- 定义变量:在 SoapUI 的 "Script" 选项卡(或通过
-
使用 DataSource (CSV, Excel, JDBC):
- 创建 DataSource:在 SoapUI 项目或测试套件的 "DataSource" 部分右键,选择 "New DataSource",选择数据源类型(如 CSV 文件)。
- 配置数据源:指定数据源文件路径,并设置列名(对应 JSON 中的字段名)。
- 绑定数据源到测试步骤:在您的 REST 请求步骤上右键,选择 "Bind DataSource",选择您创建的数据源。
- 在 JSON 中引用数据源列:在 JSON 中使用
${#DataSource#columnName}的语法来引用数据源中的列值。
CSV 文件内容:
username,email,password,age user1,user1@example.com,pass1,28 user2,user2@example.com,pass2,35JSON 请求体:
{ "username": "${#DataSource#username}", "email": "${#DataSource#email}", "password": "${#DataSource#password}", "age": ${#DataSource#age} }这样,SoapUI 会为数据源中的每一行数据执行一次请求。
-
从上一个请求的响应中获取 JSON 数据:
- 解析响应:假设您有一个获取用户列表的请求 "GetUsers",返回 JSON 数组,您可以在后续请求的 "Script" 选项卡中使用 Groovy 脚本解析这个响应,并提取特定用户的信息,然后设置到属性中。
- 引用属性:然后在后续请求的 JSON 中引用这些属性。
在 "CreateUser" 请求的 "Script" 选项卡中(前置或后置脚本):
// 假设 GetUsers 请求的响应是 JSON 数组,取第一个用户 def getUsersResponse = context.testCase.getTestStepByName("GetUsers").getRawResponse() def slurper = new groovy.json.JsonSlurper() def usersJson = slurper.parseText(getUsersResponse) if (usersJson && usersJson.size() > 0) { def firstUser = usersJson[0] // 将用户名和邮箱设置为属性,供后续请求使用 testRunner.testCase.setPropertyValue("existingUsername", firstUser.username) testRunner.testCase.setPropertyValue("existingEmail", firstUser.email) }然后在 "CreateUser" 的 JSON 请求体中:
{ "username": "newUser_${#TestCase#existingUsername}", // 示例:拼接 "email": "${#TestCase#existingEmail}", "password": "Password123", "age": 40 }
高级技巧:处理复杂 JSON 和文件上传
-
处理嵌套 JSON 和 JSON 数组:
- 对于复杂的嵌套结构,直接在 "Request Body" 中编写即可,确保层级正确。
- 使用变量时,嵌套对象的属性可以通过
${parent.child}方式引用(SoapUI 的表达式引擎支持,或者通过脚本构建整个 JSON 对象再转为字符串)。
-
JSON 作为文件上传(multipart/form-data):
- 某些 API 可能要求将 JSON 数据作为文件的一部分上传(在
multipart/form-data请求中)。 - 在 SoapUI 中,您可以添加 "File" 类型的参数,然后选择一个包含 JSON 内容的文件。
- 或者,在 "Request Body" 中选择 "Multipart",添加一个 "Text" 类型的 part,其值为 JSON 字符串,并设置相应的
Content-Disposition头(如name="json_data")。
- 某些 API 可能要求将 JSON 数据作为文件的一部分上传(在
-
使用 Groovy 脚本动态构建 JSON:
- 对于非常复杂或需要动态生成的 JSON,可以在 "Script" 选项卡中使用 Groovy 的
JsonBuilder或JsonSlurper(虽然JsonSlurper用于解析,JsonBuilder用于构建)来创建 JSON 对象,然后将其转换为字符串并设置到请求体。
import groovy.json.JsonBuilder def userData = [ username: "scriptedUser", email: "scripted@example.com", preferences: [ theme: "dark", notifications: true ], tags: ["api", "test", "groovy"] ] def jsonBuilder = new JsonBuilder(userData) def jsonString = jsonBuilder.toString() // 将生成的 JSON 字符串设置到请求体 testRunner.testCase.getTestStepByName("Create - 对于非常复杂或需要动态生成的 JSON,可以在 "Script" 选项卡中使用 Groovy 的



还没有评论,来说两句吧...