Go语言中S3/SQS事件JSON转结构体的单元测试用例咨询
Go语言S3/SQS事件反序列化的单元测试用例设计
针对你提供的unmarshal函数,除了Body为空的场景,可从以下几个维度设计单元测试用例:
合法正常场景
- 完整嵌套的标准S3事件:构造包含完整S3事件结构的SQS消息Body,验证反序列化后
s3Event的所有核心字段(如Bucket名称、对象键、事件类型)与预期完全匹配。 - 含可选字段的S3事件:测试S3事件中存在或缺失可选字段(如
userIdentity、requestParameters)的情况,确认反序列化无报错且存在的字段能正确赋值。
异常输入场景
- SQS Body格式非法:
- Body是无效JSON(如缺少闭合括号、语法错误),验证函数返回
json.Unmarshal对应的语法错误。 - Body是合法JSON但无
Message字段,或Message字段类型非字符串(如数字、布尔值),验证第一阶段反序列化报错。
- Body是无效JSON(如缺少闭合括号、语法错误),验证函数返回
- Message字段内容异常:
Message为空字符串,验证第二阶段反序列化报错。Message是合法JSON但不符合S3Event结构(如缺少Records数组、字段名拼写错误、类型不匹配),验证函数返回对应反序列化错误。
- 边界值测试:
Message是超大体积的S3事件JSON,验证反序列化的稳定性(若关注性能可加入耗时统计)。Message含特殊字符(转义字符、Unicode字符),验证反序列化后字符解析正确。
特殊格式场景
- 带多余字段的S3事件:构造包含
events.S3Event未定义字段的JSON,验证函数能正确解析已知字段,忽略多余字段(Go JSON包默认行为,需确认符合预期)。 - 字段名大小写不匹配:比如SQS Body中
message为小写(结构体标签是json:"Message"),验证反序列化后e.Message为空,进而第二阶段报错,确认该行为符合预期。
测试代码示例
package yourpackage import ( "encoding/json" "testing" "github.com/aws/aws-lambda-go/events" "github.com/stretchr/testify/assert" ) func TestUnmarshal_ValidFullEvent(t *testing.T) { // 构造完整的嵌套JSON结构 sqsBody := `{"Message": "{\"Records\": [{\"s3\": {\"bucket\": {\"name\": \"test-bucket\"}, \"object\": {\"key\": \"test-key\"}}}]}" }` sqsMsg := events.SQSMessage{Body: sqsBody} result, err := unmarshal(sqsMsg) assert.NoError(t, err) assert.Len(t, result.Records, 1) assert.Equal(t, "test-bucket", result.Records[0].S3.Bucket.Name) assert.Equal(t, "test-key", result.Records[0].S3.Object.Key) } func TestUnmarshal_InvalidSQSBody(t *testing.T) { // 传入语法错误的JSON sqsMsg := events.SQSMessage{Body: `{"Message": "invalid-json`} result, err := unmarshal(sqsMsg) assert.Error(t, err) assert.IsType(t, &json.SyntaxError{}, err) } func TestUnmarshal_EmptyMessage(t *testing.T) { sqsBody := `{"Message": ""}` sqsMsg := events.SQSMessage{Body: sqsBody} result, err := unmarshal(sqsMsg) assert.Error(t, err) }
内容的提问来源于stack exchange,提问作者Alina
相关产品推荐
相关产品推荐

