2018年5月开始接触dubbo接口测试,测试对象主要是为业务提供基础数据增删改查相关的微服务接口,接口逻辑简单,但发现的bug还是不少。
总结微服务类接口测试点及常见bug如下:
取值考虑 | 常见问题 | 注意项 | |
---|---|---|---|
参数 |
空 null [] “” undefined |
1、空指针异常 java.lang.NullPointerException |
必填的参数值不可以为空,需要判空处理 |
正确 | 1、可以调用接口,但是接口返回的内容校验不通过,不符合需求 2、返回内容缺失 3、返回内容如果是批量数据,展示的顺序是否合理 4、接口调用后,功能未符合需求、不生效 |
1、需要检查返回内容的正确性 2、需要检查返回内容的完整性 3、需要检查返回内容的顺序合理性 4、需要检查接口调用后的功能正确性 |
|
错误的 (不存在、无对应记录、格式错误) |
|||
已删除的 (已隐藏/已禁用/已废弃) |
|||
特别的类型 (在熟悉业务基础数据属性的特性后可总结相关的数据字典,注意特殊的数据取值) 1、默认的 2、用于演示的 3、不用类型的 4、有关联关系的(父、子、附属) 等 |
1、未做限制处理 2、演示类的数据未过滤(比如,演示的信息不应影响其他正常信息统计) 3、特定产品的特定功能未限制类型、功能入口 4、当参数取值存在更复杂的类型对象时,未处理相关的复杂关联逻辑 |
1、对有特殊含义的保留参数类型需做对应限制处理 2、对非正常用户生成的数据(线上测试、演示)做过滤,不影响其他用户正常使用 3、不同类型之间的权限限制应明确,不产生影响正常使用的数据,必要时限制入口 4、当参数取值存在更复杂的类型对象时,需要做对应考虑和处理 5、熟悉业务,了解参数可能的类型和特殊情况 |
|
边界值、临界值 | 1、输入参数200,提示“不能超过200”(其实200按提示是正常的,却抛出了异常提示) |
1、注意限制条件中的边界值是包含还是不包含关系,明确对应的提示信息 “不超过、不少于、大于等于、小于等于、大于、小于” |
|
内部类、参数 | 1、当参数内部包含内部参数或对象时,未做对应限制处理 | 1、内部参数也需要校验 | |
包含内部接口的接口 | 1、接口包含内部接口,但是相关限制条件和校验规则不一致 | 1、使用内部接口,需要认真了解内部接口信息,至少要看看内部接口的文档,特别注意限制条件,保持里外一致 |
|
多个参数 | 1、各种条件的排列组合 2、参数间的关系不匹配 |
1、组合后的参数校验失效、错误 2、参数间有关系,但未作相关判断限制(比如老师加入部门,但未判断老师所在学校与部门所在学校是否一致;用户A的工单用用户B的登录token也能成功绑定;开始时间大于结束时间未限制) |
1、保持严谨的逻辑,清晰地处理各个参数的限制,并对组合参数做处理 2、考虑参数间的显性、隐性关系,校验必要的关系匹配性 |
接口类型 |
取值考虑 |
常见问题 |
注意项 |
---|---|---|---|
增!!!(出现bug的大头) | 1、插入数据做边界限制校验 2、插入数据的正确性 |
1、当插入超长字符、超边界数字、超大list时,程序异常 2、当插入的参数值是不存在、已删除、不正确、空的对象取值时,仍可以新增成功 |
1、新增的数据需要保证插入内容与数据表字段限制设计相符或与业务要求一致 2、新增数据的正确性需要保证,或者事先明确是否由业务端调用方做强限制 |
删 | 1、删除后未对相关联的记录做处理 | 1、考虑好删除的影响范围 | |
改 | 1、数据更新但updatetime未更新 2、数据对象更新但相关的相关记录未更新 3、更改影响到了不需要更改的内容 4、对已删除的记录仍进行更新处理 |
1、检查更新时间 2、考虑影响范围,如果数据更改会影响其他有关系的数据、数据表记录也需要同步更新 3、推荐使用文本对比工具等(例如Beyond Compare )检查调用接口前后数据表的变化 4、判断到记录已删除时,更新应不生效 |
|
查 | 1、未清晰相关限制,导致查询失败 (比如,搜索引擎ES设置了最大只能返回10000条; 在mybaits里针对Integer类型的0值会被默认当做空) 2、当一个表中有多个时间相关的字段时,判断时间取错字段 3、当查询参数有多个时,通过一些排列组合出的参数组合,sql拼接错误或查询逻辑混乱,查询结果错误 4、查询子关系时,未按要求过滤父对象、参数自身 |
1、检查相关内容的限制条件 2、检查所取时间字段符合需求,区分好不同时间的含义 3、假设查询参数是abc,那么a、b、c、ab、ac、bc、abc的查询组合都需要是正常的,要理清逻辑,注意sql的拼接是否合理 4、对包含、非包含关系做处理,明确需求与实现 |
数据库、表相关 |
取值考虑 |
常见问题 |
注意项 |
---|---|---|---|
超长 | Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1 | 设置合理的参数值长度,对超长的做限制处理,抛出对应异常提示 | |
超出范围 (min-1,max+1) |
Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'count' at row 1 |
设置合理的参数值范围,对超出范围的做限制处理,抛出对应异常提示 | |
异步 | |||
sql语句的字段名写错(写成别的字段、大小写错误) | 1、不粗心大意,注意检查sql语句字段正确性 2、设计数据库数据表时,做好注释、备注信息,让字段含义清晰 3、字段命名保持一定规律、慎用大小写 |
||
sql查询结果在程序中映射成不对应的类型,导致接口查询对象为空 | 注意类型映射处理,保证类型一致 |
缓存 |
取值考虑 |
常见问题 |
注意项 |
---|---|---|---|
1、第一次多条件查询,生成对应的缓存。当第二次使用变更其中一个条件来查询时,所取缓存内容仍为上一次查询内容,不正确 | 1、注意缓存设计需要合理。 |
mq |
取值考虑 |
常见问题 |
注意项 |
---|---|---|---|
触发条件 | 1、在不该发的时候发了 |
1、检查触发mq的条件是否符合需求 |
|
作用对象 | 1、在不对应的对象类型上发了 | 1、检查mq的tag与对象类型是否对应 |
|
关联mq | 1、场景未触发关联mq的实际条件时也发了mq | 1、检查mq的直接触发条件是否必然决定了关联mq的发送,不是的话要加判断限制 (比如取消老师某班某科目并不必然决定老师退出该班级,需要加判断该老师是否在某班还任课其他科目) |
|
mq内容 | 1、消息体中的信息缺失 | 1、检查消息的各项信息,完整且正确 | |
并发、性能 | mq消息繁忙导致消息发送失败 | 做好mq中间件的维护和监控 |
结果校验 |
测试点 |
常见问题 |
注意项 |
---|---|---|---|
检查抛出的异常的提示文案 | 1、错别字 2、与实际操作不符 |
1、不粗心大意,注意检查文案正确性 2、复制粘贴后记得修改正确,符合需求,或者直接按需求文档做复制源,而不是上一个接口文案 |
|
检查正常返回结果 | 1、可以调用接口,但是接口返回的内容校验不通过,不符合需求 2、返回内容缺失,需求要求的参数值返回null 3、返回内容的展示顺序不合理,数据多且无排序过滤,业务拿到数据后使用不便 4、返回内容中未过滤已删除的deleted=1的记录 |
1、需要检查返回内容的正确性 2、需要保证返回内容的完整性,需求要求的参数值不返回空值 3、返回内容如果是批量数据,需要检查返回内容的顺序合理性,按需求来,需求没有细化时需要确认 4、返回内容中需要明确是否有过滤相关无用数据 |
接口性能 |
测试点 |
常见问题 |
注意项 |
---|---|---|---|
接口耗时 | 接口耗时过长 | 1、使用运维平台提供的功能,配置好项目的监控 2、配置好接口的耗时的告警阈值,并设置好相关项目的异常通知联系人 3、关注链路监控中耗时比较大的接口,考虑是否需要优化 4、检查使用的sql语句的效率 5、若接口内部依赖其他接口,当内部接口返回异常或者请求超时时需要做相关处理 6、接口延迟重试等配置需要合理,请检查下告警配置 |
|
并发 | 1、接口存在高并发使用场景但未做相关对应的压力测试,上线后发现性能不佳 2、并发写操作,插入数据唯一性被破坏 3、锁 |
1、事先根据用户量、用户使用场景,送测前评估好做压力测试的必要性,明确压力测试的目标状态 2、注意并发写场景下,内容唯一性限制 (对于唯一性有严格要求的内容,需要监控线上重复数据是否存在,避免旧版本已引起该类问题而未被发现处理) 3、注意异步锁、同步锁、线程等设计的合理性 |
接口代码备注、接口文档问题 |
注意项 |
---|---|
接口文档中的版本号错误,导致引用不到对应的类 | 1、注意检查接口文档信息的正确性(版本号) 2、接口文档能放在云平台、线上,就别放在本地 |
已废弃的接口未备注 |
已废弃的需要有相关标识 |
未废弃的接口备注要废弃或已废弃 | 1、注意接口代码中的备注,不能添加多余干扰信息,保持整洁清晰统一的备注风格 2、不允许备注使用中的接口为废弃,要废弃前需要确保接口真的已经不被任何相关方使用后才可进行操作 |
以上
愿那些年Ta犯过的错,我们不会再重蹈覆辙