测试积累
1.小数位向上取整问题
场景描述:需求:项目车零件对应的“备货系数”值需保留两位小数,超过两位部分向上取值(例:导入为备货系数为“12.341”,导入后实际取值为“12.35”)
缺陷现象:导入其他数值取值没有问题,当数值为“1.1”时,导入后实际数值为“1.11”,当数值为“1.3”时,导入后实际数值为“1.31”
原因:开发使用String类型接收导入数据,转化为Double类型在做处理,因为Bouble精度导致
解决方案:改为bigdecimal类型接收并处理
2.SQL拼接问题
场景描述:需求:零件显示对应的配置(packaged)和选中方式(S/O/-)
缺陷现象:列表零件配置较多时,后面配置选中方式未显示
原因:SQL使用了GROUP_CONCAT函数,默认最大长度是1024,查询结果拼接数据超过该长度
解决方案:修改数据库该字段长度
-- 查询使用SQL SELECT t.* , ( SELECT GROUP_CONCAT( CONCAT( p.sub_package, '|', p.relation ) ) FROM tt_production_lou_package p WHERE t.lou_id = p.lou_id ORDER BY p.sub_package ) sub_package FROM tt_production_lou_bom t WHERE t.part_no in ( '11110019' ) AND ( (date_format(t.bp_estimate_production_to,'%Y-%m-%d %T') > date_format('1900-01-01T00:00:00.000+0800','%Y-%m-%d %T') AND date_format(t.bp_estimate_production_from,'%Y-%m-%d %T') <= date_format('9999-12-31T23:59:59.000+0800','%Y-%m-%d %T') ) or ( date_format(t.bp_estimate_production_from,'%Y-%m-%d %T') <= date_format('1900-01-01T00:00:00.000+0800','%Y-%m-%d %T') AND date_format(t.bp_estimate_production_to,'%Y-%m-%d %T') >date_format('1900-01-01T00:00:00.000+0800','%Y-%m-%d %T') ) or (date_format(t.bp_estimate_production_from,'%Y-%m-%d %T') <= date_format('9999-12-31T23:59:59.000+0800','%Y-%m-%d %T') AND date_format(t.bp_estimate_production_to,'%Y-%m-%d %T') >date_format('9999-12-31T23:59:59.000+0800','%Y-%m-%d %T') ) ) order by t.lou_id,t.mbom_id asc LIMIT 10; -- 查询group_concat函数的最大存储位数 show variables like 'group_concat_max_len';
3.数字大小对比
场景描述:需求:排程设置的 车型组批数 >= 最小组批数
缺陷现象:车型组批数为“12”.最小组批数为“2”,校验不通过
原因:两个字段对比时,采用了字符串的大小对应,对比第一位数的时候2>1,所以校验失败
解决方案:将两个字段转化为数字后在进行大小对比
4.数据库读写分离
场景描述:需求:从上游系统接收车型配置信息,写入接口表,并把接口表数据根据唯一唯一KEY值写入业务表
缺陷现象:上游系统唯一KEY数据值为810条,实际写入接口表数量为810条,但写入业务表仅800条,且在其他环境更大数据量时未出现该场景
原因:该环境数据库进行了读写分离,故写入和读数据时间有毫米级时差。在写入接口表程序执行完成时即调用程序执行写入业务表,但此时接口表数据数据未完全提交,没有读到最后10条数据
解决方案:关闭读写分离,使用同一数据库
5.缓存问题
场景描述:需求:根据VC+打散日期,基于BOM基础数据,打散出对应的BOM数据(所有子件数据)
缺陷现象:同样的VC+打散日期在SIT环境打散出的结果是正确的,在生产某个头零件对应的子零件都缺失
原因:程序防止重复获取数据,查询时BOM数据会写入缓存,缺失的零件对应的头零件存在两条数据(一条生效,一条失效),生产环境优先查询了在打散日期不生效的零件,该零件数据写入缓存,打散时,该零件有效期不生效,故打散不出对应的子件,测试环境没有查询,首次打散就使用的打散时间,缓存中写入的是生效的头零件
解决方案:打散时,把对头零件有效期的校验去除(能出现头零件时,则证明该零件能打散出来,无需再判断零件有效期,只需要判断子件的有效期即可)