IF ratio > r_max THEN

  SET r_max=ratio;

  END IF

  IF ratio < r_min THEN

  SET r_min=ratio;

  END IF

  INSERT INTO tb_os_test(ucid,os_do,os_done,os_ratio)

  VALUES(uc_id,do_num,done_num,ratio);

  FETCH uc_info INTO uc_id;

  END WHILE

  CLOSE uc_info;

  UPDATE tb_os_test SET ratio_max=r_max;//在测试表中,保留大转化率

  UPDATE tb_os_test SET ratio_min=r_min;//在测试表中,保留小转化率

  OPEN uc_info;

  WHILE uc_id IS NOT NULL DO//计算结果,并验证被测计算功能的计算结果

  SELECT os_ratio INTO ratio FROM tb_os_test WHERE ucid=uc_id;

  SELECT total INTO point_tested

  FROM tb_os_point

  WHERE ucid=uc_id;//取出被测计算功能结果

  SET point_test = (ratio-r_min)/(r_max-r_min)*100;//得到终评分

  UPDATE tb_os_test SET os_point=point_test WHERE ucid=uc_id;

  SET point_error = point_test-point_tested;//两个结果的误差

  IF ABS(point_error) <= error_allow THEN

  // 如果计算结果误差小于允许误差,则通过测试;否则,测试不通过

  //标记通过测试

  UPDATE tb_os_test SET is_pass=0 WHERE ucid=uc_id;

  ELSE

  //标记不通过测试

  UPDATE tb_os_test SET is_pass=0 WHERE ucid=uc_id;

  END IF

  FETCH uc_info INTO uc_id;

  END WHILE

  CLOSE uc_info;

  END

  在测试这种复杂数学运算的功能时,有一点要特别注意,是计算过程中的小数点取舍问题。设计和编写测试用例前,一定要和RD、PM沟通好浮点数运算的精度和取舍方法。为了防止不同语言在浮点数精度上处理方式不同而导致的误差,上面的用例还特别设计了误差阈值,在测试时,可以根据不同情况灵活处理。完成测试用例编写后,要在测试环境的数据库中创建测试所用的存储过程。

  测试执行时,先要调用计算功能的接口,然后登录数据库,执行call testStat( , ,0.1)。存储过程执行后,查看测试表中的is_pass字段即可获知,哪些数据项目测试通过,哪些数据项目测试没有通过。如果存在不通过的情况,可以根据其他字段顺藤摸瓜,很方便的定位到Bug。

  4 总结

  在采用本文所述方法的项目测试中,也发现了一些问题和有待改善之处:首先,一般的关系型数据库不支持存储过程调试,在测试用例调试时,必须借助第三方的调试工具,盘古项目采用的是MySQL数据库,这里推荐一个MySQL的第三方开发的调试工具dbForge Studio for MySQL,其他数据库也有类似的调试工具);其次,不支持跨物理数据库的计算逻辑测试,目前对于跨数据库的测试,还是将多个物理库的数据拷入一个物理库的多个逻辑数据库中进行测试;后,目前执行时需要手动启动执行,自动执行方案还需要进一步调研,可选方案有设置触发器执行、定时脚本执行等。上述都是要在今后的测试工作中跟进解决和提高的地方。