然后,使用存儲過程編寫測試用例,下面為存儲過程代碼
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.anti-gravitydesign.com