背景
在测试和生产环境出现的一些问题,无论级别程度,这些问题会产生不可预知的负面影响。
不能因为QA同事的存在就放松研发自己的警惕,或者说,降低自己的标准。
测试作为发生线上问题一道重要防线,不可使其孤军奋战。QA 并不能生产质量,开发才是质量的生产者。
目的
提升研发交付质量 。以降低提测bug为己任,消灭线上问题为目标。
应对措施
- 1、关注参数的校验,包括长度、字符集(数字?字母?大小写?)、NULL、非空、类型(整数、小数点几位?)、必填等
- 2、关注边界值的验证,包括最小值、最大值、临界值、数组长度等
- 3、关注异常(Exception)的处理及NULL的判断,保证程序的健壮性
- 4、常用的方法一定要抽取出来,做成通用的逻辑(比如精度的处理、小数点位的处理、response的发送等)
- 5、代码合并提交之前,必须做二次确认,确保合并正确
- 6、文案、报错信息、时间格式、数据精度等必须跟需求一致,或者跟产品、测试讨论清楚
- 7、确认各套环境的变量、SQL语句是否正确、设置到位
- 8、数据库里的各个字段是否被正常的更新
- 9、编码过程中彻底了解每个类 / 方法的使用场景及其使用方法
- 10、定期(每个迭代周期 / 项目完结后)分析个人 / 本组的bug情况,针对常见bug进行宣贯并更新代码 review的checklist
- 11、需要特别关注异常场景,比如MQ的顺序、锁的使用及其释放、队列的长度、线程安全等
- 12、回归过程中 / GR上发现的bug,讨论清楚后再动手修改,避免修改造成其他bug,修改范围要可控
- 13、重要迭代 / 项目,研发必须跑通冒烟用例,如果有时间,可以找测试要全量的测试用例
- 14、在技术需求、系统需求的jira单子里,写清楚本次需求开发中需要注意的地方,开发完成后再对照- - 15、产品需求,确认无遗漏
- 16、前端界面的测试,可以使用交叉测试
- 17、避免根据字符串匹配做相关逻辑操作,使用key关键字做匹配,避免他人修改字符串值引起bug。
所有的逻辑分支都要覆盖
所有的逻辑组合都要覆盖
正常系、异常系都要覆盖
各种错误码的场景都要覆盖
入参边界值都要覆盖
举例:以下的函数,根据用户输入的年龄,判断是否可以进行工作,同时也会检验用户实际的年龄跟输入的年龄是否符合
int checkAge(int age,long userId){
if (WORD_AGE_MIN > age || WORK_AGE_MAX < age) { /* 代码段A*/
log.error("illegal age range,age={}, id={}", age, userId);
return ERROR_AGE_RANGE;
}
userDto user = getUserInfoById(userId); /* 代码段B*/
if (NULL == user) {
log.error("call getUserInfoById error, id={}", userId);
return ERROR_GET_USER_INFO;
} else {
/* 从身份证信息推断用户的age是否OK */
int actualAge = user.getAgeByIdCard();
if (actualAge != age) {
log.error("age error. age={}, actualAge={}, id={}", age, actualAge, userId);
return ERROR_AGE_NOT_EQUAL;
}
return OK;
}
为了进行全面的自测,我们需要进行以下的测试:
代码段A:
为了进行代码段A的测试,需要将age所有的取值,包括边界值,都考虑到,需要构造以下的场景:
1 小于WORD_AGE_MIN 测试if (WORD_AGE_MIN > age || WORK_AGE_MAX < age),并且条件符合 ERROR_AGE_RANGE;
2 等于WORD_AGE_MIN 测试if (WORD_AGE_MIN > age || WORK_AGE_MAX < age),条件不符合 继续往下跑,跑代码段B
3 介于WORD_AGE_MIN与WORD_AGE_MAX 测试if (WORD_AGE_MIN > age || WORK_AGE_MAX < age),条件不符合 继续往下跑,跑代码段B
4 等于WORD_AGE_MAX 测试if (WORD_AGE_MIN > age || WORK_AGE_MAX < age),条件不符合 继续往下跑,跑代码段B
5 大于WORD_AGE_MAX 测试if (WORD_AGE_MIN > age || WORK_AGE_MAX < age),并且条件符合 ERROR_AGE_RANGE;
代码段B:
为了进行代码段B的测试,需要构造以下的场景
6 不存在的userId或者调用出错的 if (NULL == user) ,条件成立 ERROR_GET_USER_INFO
7 能够获取到用户实际年龄,并且是虚假年龄 if (actualAge != age) ,条件成立 ERROR_AGE_NOT_EQUAL
8 能够获取到用户实际年龄,并且是真实年龄 if (actualAge != age) ,条件不成立 OK
综合来看,场景3,4,5能往下跑,而为了测试代码段B,需要场景6,7,8,所以从整个逻辑来看,我们需要构造5个case,能够跑遍所有的逻辑,
同时返回所有的错误码,这5个是必测的,如果你有更多的测试时间,当然也可以构造更多的case进行自测
1 age 小于WORD_AGE_MIN,userId实际存在 ERROR_AGE_RANGE
2 age 等于WORD_AGE_MIN,userId不存在 ERROR_GET_USER_INFO
3 age 介于WORD_AGE_MIN与WORD_AGE_MAX,userId对应的用户信息年龄等于age OK
4 age 等于WORD_AGE_MAX,userId对应的用户信息年龄不等于age ERROR_AGE_NOT_EQUAL
5 age 大于WORD_AGE_MAX,userId实际存在 ERROR_AGE_RANGE
网友评论