使用endly做E2E测试时,JSON存int键到Aerospike Map报错求助
解决Aerospike Map整数键与JSON字符串键的冲突问题
你碰到的这个invalid character '1' looking for beginning of object key string报错,核心原因很明确:JSON语法强制要求对象的键必须是字符串,但Aerospike的Map允许整数作为键,而endly的dsunit组件默认用标准JSON解析测试数据,直接写{1: "value"}这种格式自然会触发语法错误。
下面给你几个针对性的解决方案,按易用性排序:
方法1:用endly内置的类型标记前缀
endly的dsunit支持通过特定前缀来声明键的类型,你只需要把JSON里的字符串键改成__int:数字的格式,dsunit在写入Aerospike时会自动把前缀去掉,将键转换成整数类型。比如:
{ "__int:1": "user_1_data", "__int:2": "user_2_data" }
这种方式不需要修改工作流配置,直接调整测试数据即可,是最快捷的解决办法。
方法2:在data.yaml中配置字段类型映射
如果你的测试数据里有大量需要整数键的Map,可以在dsunit的注册配置里添加类型映射规则,一劳永逸地指定某个bin的Map键类型。比如在你的@data.yaml里修改register步骤:
defaults: datastore: db1 pipeline: register: action: dsunit:register config: driverName: aerospike # 保留你原有的其他配置 mappings: - entity: 你的实体名称 fields: 你的Map类型bin名称: type: map keyType: int
配置后,dsunit处理这个bin的数据时,会自动把JSON中的字符串键转换成整数键,不用再手动加前缀。
方法3:用脚本预处理数据
如果上面两种方法都不适合你的场景,还可以在数据写入前用endly的脚本能力做一次转换。比如在工作流里加一个预处理步骤:
pipeline: # 先把字符串键的JSON转成整数键的Map preprocess_map_data: action: script:js script: | // 这里替换成你的原始测试数据 let rawJsonData = { "1": "v1", "2": "v2", "3": "v3" }; let intKeyMap = new Map(); Object.keys(rawJsonData).forEach(key => { intKeyMap.set(parseInt(key), rawJsonData[key]); }); return { processedMap: intKeyMap }; # 再把处理好的Map写入Aerospike write_to_aerospike: action: dsunit:import source: $preprocess_map_data.processedMap target: db1/你的实体名称/你的Mapbin名称
通过JavaScript脚本完成键类型的转换,再传递给dsunit写入数据库。
验证数据是否正确写入
写完数据后,你可以用dsunit的query动作验证结果,此时预期值里直接写整数键即可:
verify_map_data: action: dsunit:query datastore: db1 entity: 你的实体名称 where: id = '你的记录ID' expect: 你的Mapbin名称: 1: "user_1_data" 2: "user_2_data"
内容的提问来源于stack exchange,提问作者terry.zhao
相关产品推荐
相关产品推荐

