如何编写JSON做测试:从基础到实践的全面指南
引言:为什么JSON是测试中的“常客”?
在软件测试领域,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,几乎无处不在,无论是接口测试、数据迁移验证、前端组件交互,还是配置文件管理,JSON都凭借其易读性强、结构灵活、解析高效的特点,成为测试人员的“得力助手”。
编写正确的JSON数据是测试工作的基础——一个格式错误的JSON可能导致接口调用失败,一个数据缺失的JSON可能让测试用例覆盖不全,一个逻辑矛盾的JSON则可能隐藏潜在的缺陷,本文将从JSON的基础语法出发,结合测试场景,逐步拆解“如何编写符合测试需求的JSON”,并提供实用技巧和示例。
JSON基础:编写前的“必修课”
在动手编写JSON前,先快速回顾其核心语法规则,JSON本质上是“键值对”(Key-Value Pair)的集合,结构清晰,但格式要求严格,一个细节错误就可能导致整个JSON无效。
核心数据结构
JSON支持两种核心结构:
-
对象(Object):用 包裹,由无序的键值对组成,键(Key)必须是字符串(需用双引号 包裹),值(Value)可以是任意类型。
{ "name": "张三", "age": 25, "isStudent": false } -
数组(Array):用
[]包裹,由有序的值列表组成,值可以是任意类型(包括对象或数组)。[ {"id": 1, "city": "北京"}, {"id": 2, "city": "上海"} ]
支持的数据类型
JSON中的值可以是以下6种类型:
| 类型 | 示例 | 说明 |
|---|---|---|
| 字符串(String) | "hello" |
必须用双引号包裹,不能用单引号 |
| 数字(Number) | 100、14 |
不支持科学计数法(如1e3) |
| 布尔值(Boolean) | true、false |
全小写,首字母不能大写 |
| 空值(Null) | null |
表示“无值” |
| 对象(Object) | {"key": "value"} |
键值对集合 |
| 数组(Array) | [1, 2, "a"] |
有序值列表 |
语法“红线”:这些错误千万别犯!
- 键必须用双引号:
{name: "张三"}是错误的,必须是{"name": "张三"}; - 字符串值必须用双引号:
{'name': '张三'}是错误的,必须是{"name": "张三"}; - 不能有注释:JSON原生不支持注释(如
// 注释或/* 注释 */),需通过其他方式补充; - 不能有尾随逗号:
{"name": "张三",}是错误的,最后一个键值对后不能加逗号; - 数字不能有前导零(除非是0本身):
{"age": 01}是错误的,必须是{"age": 1}。
测试场景下的JSON编写:从“能用”到“好用”
测试不是“为了写JSON而写JSON”,而是要基于测试目标(如功能验证、边界测试、异常场景等)设计合理的JSON数据,下面结合常见测试场景,拆解JSON的编写方法。
场景1:接口测试——构造请求参数与校验响应结果
接口测试是JSON最核心的应用场景,包括发送请求参数(如POST/PUT请求的Body)和校验服务端响应结果。
(1)编写请求参数:覆盖“正常+异常”组合
接口参数通常分为必填项和可选项,测试时需构造不同组合的数据:
-
正常场景:填写所有必填项和可选项,验证接口能否正确处理。
{ "username": "test_user001", "password": "Test@123456", "email": "test@example.com", "age": 25, "preferences": { "theme": "dark", "language": "zh-CN" }, "tags": ["tech", "travel"] } -
异常场景:故意缺失必填项、填写错误类型、超出长度限制等,验证接口校验逻辑。
// 缺失必填项 "password" { "username": "test_user001", "email": "test@example.com" } // 字符串类型参数填数字(如 "username" 填数字) { "username": 12345, "password": "Test@123456" } // 数值超出范围(如 "age" 填负数) { "username": "test_user001", "password": "Test@123456", "age": -5 }
(2)编写响应校验:定义“预期结果”
接口响应的JSON需用于校验服务端返回的数据是否符合预期,通常需关注:
- 状态码:如
{"code": 200, "message": "success"}; - 关键字段是否存在:如用户信息接口需校验
{"data": {"id": 1001, "name": "张三"}}是否包含id和name; - 数据类型是否正确:如
{"price": 99.9}需确认price是数字而非字符串; - 嵌套结构是否匹配:如订单接口需校验
{"order": {"items": [{"productId": 2001, "quantity": 2}]}}中的嵌套数组结构。
场景2:数据驱动测试——用JSON管理测试用例
数据驱动测试(DDT)通过外部数据源(如JSON、Excel、CSV)管理测试用例,避免代码中硬编码数据,提升维护效率,JSON因其结构化特性,特别适合管理复杂测试用例。
示例:登录接口的数据驱动JSON
将不同登录场景的输入、预期输出组织成一个JSON数组,测试框架(如Pytest、TestNG)可遍历数组执行测试:
[
{
"test_name": "正常登录-用户名密码正确",
"input": {
"username": "admin",
"password": "Admin@123"
},
"expected": {
"code": 200,
"message": "登录成功",
"data": {"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."}
}
},
{
"test_name": "异常登录-密码错误",
"input": {
"username": "admin",
"password": "WrongPwd"
},
"expected": {
"code": 401,
"message": "用户名或密码错误",
"data": null
}
},
{
"test_name": "异常登录-用户名为空",
"input": {
"username": "",
"password": "Admin@123"
},
"expected": {
"code": 400,
"message": "用户名不能为空",
"data": null
}
}
]
测试代码中只需读取该JSON,遍历每个对象,将 input 作为请求参数,expected 作为校验标准即可。
场景3:前端组件测试——模拟状态与Props
前端测试(如React、Vue组件测试)常需模拟组件的输入(Props)和状态(State),JSON可用于定义这些数据结构。
示例:用户信息组件的测试数据
假设组件接收 userInfo 作为Props,JSON可定义不同用户状态的数据:
{
"normalUser": {
"id": 1001,
"name": "张三",
"avatar": "https://example.com/avatar1.jpg",
"isVIP": false,
"loginTime": "2023-10-01T12:00:00Z"
},
"vipUser": {
"id": 1002,
"name": "李四",
"avatar": "https://example.com/avatar2.jpg",
"isVIP": true,
"loginTime": "2023-10-02T08:30:00Z"
},
"emptyUser": {
"id": null,
"name": "",
"avatar": null,
"isVIP":


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