一种基于存储过程的复杂计算功能测试的方法(2)

发表于:2012-10-29来源:百度质量部作者:不详点击数: 标签:功能测试
然后,使用存储过程编写测试用例,下面为存储过程代码 CREATE PROCEDURE testStat(IN start_date DATE, IN end_date DATE, IN error_allow DOUBLE) //三个输入分别为起始日期、截

  然后,使用存储过程编写测试用例,下面为存储过程代码

  CREATE PROCEDURE testStat(IN start_date DATE, IN end_date DATE, IN error_allow DOUBLE)

  //三个输入分别为起始日期、截止日期和允许计算误差

  BEGIN

  DECLARE uc_id INT DEFAULT 0;//销售人员ID

  DECLARE done_num INT DEFAULT 0;//成交客户数

  DECLARE do_num INT DEFAULT 0;//拜访客户数

  DECLARE ratio DOUBLE DEFAULT 0;//转化率

  DECLARE r_max DOUBLE DEFAULT 0;//销售人员中的最大转化率

  DECLARE r_min DOUBLE DEFAULT 100;//销售人员中的最大转化率

  DECLARE point_test DOUBLE DEFAULT 0;//测试代码计算逻辑

  DECLARE point_tested DOUBLE DEFAULT 0;//被测功能逻辑的计算结果

  DECLARE point_error DOUBLE DEFAULT 0.1;//误差

  DECLARE uc_info CURSOR for SELECT ucid FROM tb_os_point;

  DECLARE CONTINUE HANDLER FOR SQLSTATE ’02000′ SET uc_info=NULL;

  OPEN uc_info;

  FETCH uc_info INTO uc_id;

  WHILE uc_id IS NOT NULL DO//计算转化率,并保留中间过程

  SELECT count(*) INTO do_num //计算总拜访数

  FROM tb_os_log

  WHERE visit_date>start_date AND vistit_date SELECT count(*) INTO done_num //计算成交订单数

  FROM tb_os_log ;

  WHERE visit_date>start_date AND vistit_date SET ratio = done_num / do_num;

  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,其他数据库也有类似的调试工具);其次,不支持跨物理数据库的计算逻辑测试,目前对于跨数据库的测试,还是将多个物理库的数据拷入一个物理库的多个逻辑数据库中进行测试;最后,目前执行时需要手动启动执行,自动执行方案还需要进一步调研,可选方案有设置触发器执行、定时脚本执行等。上述都是要在今后的测试工作中跟进解决和提高的地方。

原文转自:http://www.ltesting.net