某天,组里的小哥对我说,某个服务的 function test failed,可能是与我的最近一次代码改动有关。我有点震惊,就那小改动,居然会影响。既然锅都来了,那就看看我的代码,看看是不是真的有问题。 首先,我们定位到 test failed 的地方,TestUpdateDriverTier function 失败了。接着我们去 kibana 看看 log, 发现错误是
1
error=no tier config found for cityID : 1 and taxiTypes [233]
既然日志说没有 no found,我又去检查配置中心,结果配置中心是有对应的 json 配置的。
坑一
我随后又再看了一眼 function test ,离谱的地方是 TestUpdateDriverTier 失败了,但是 TestBulkUpdateDriverTier 成功了。我检查了两个代码的区别:UpdateDriverTier 和 BulkUpdateDriverTier 的唯一不同是: BulkUpdateDriverTier 是一个 for 循环单个更新,而 UpdateDriverTier 是只有一个更新。两者背后调用的 function 都是一样了,这就使我百思不得其解了: 为什么只有 TestUpdateDriverTier 失败了。
难上加难的地方在于:function test 不像 unit test 可以轻松的在本地测试,function test 需要在远程服务器上测试。为了复现这个问题, 我在自己的电脑上调用那个 API, 结果还真就只有 UpdateDriverTier 报错误, BulkUpdateDriverTier 没有报错。
if err != nil { fmt.Println(err) } fmt.Printf("tierjson type is: %T\n", tierjson) fmt.Printf("tierjson value is: %v\n", string(tierjson))
var tier1 TierRules str := "{\"rank\":\"1\",\"tierID\":\"1\",\"useAsDefault\":true}" fmt.Printf("str value is: %v\n", str) err = json.Unmarshal([]byte(str), &tier1) if err != nil { fmt.Println("反序列化错误:", err) } fmt.Printf("tier1 type is: %T\n", tier1) fmt.Printf("tier1 value is: %v\n", tier1)
}
运行结果如下
1 2 3 4 5 6 7 8
tierjson type is: []uint8 tierjson value is: {"rank":1,"tierID":1,"useAsDefault":true}
str value is: {"rank":"1","tierID":"1","useAsDefault":true} 反序列化错误: json: cannot unmarshal string into Go struct field TierRules.rank of type int64
tier1 type is: main.TierRules tier1 value is: {0 0 true}