日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
存儲(chǔ)過程測試流程--以MySQL為例

同C/C++/Java等語言編寫的代碼一樣,用SQL語言編寫的存儲(chǔ)過程也需要進(jìn)行充分的測試。本文以實(shí)際的MySQL存儲(chǔ)過程為例,介紹存儲(chǔ)過程測試的整個(gè)流程。

在本文中,需要被測試的存儲(chǔ)過程如下:

 
 
  1. drop procedure if exists pr_dealtestnum; 
  2. delimiter // 
  3.  
  4. create procedure pr_dealtestnum 
  5.     in    p_boxnumber    varchar(30), 
  6.     out   p_result       int, 
  7.     out   p_outusertype  int 
  8. pr_dealtestnum_label:begin 
  9.     declare   p_boxnumcount    int; 
  10.     declare   p_usertype       int; 
  11.  
  12.     set p_boxnumcount = 0; 
  13.     set p_usertype     = 0; 
  14.     set p_outusertype  = 0; 
  15.  
  16.     select count(*) into p_boxnumcount from tb_testnum where boxnumber=p_boxnumber; 
  17.     if p_boxnumcount > 0 then 
  18.     begin 
  19.         select usertype into p_usertype from tb_testnum where boxnumber=p_boxnumber; 
  20.  
  21.         set p_outusertype =  (p_usertype+1)/10*10; 
  22.  
  23.         set p_result = 0; 
  24.     end; 
  25.     else 
  26.     begin 
  27.         set p_result = 1; 
  28.     end; 
  29.     end if; 
  30.  
  31.     leave pr_dealtestnum_label; 
  32. end; 
  33. // 
  34. delimiter ; 
  35. select 'create procedure pr_dealtestnum ok'; 

在存儲(chǔ)過程中使用到的表tb_testnum如下:

 
 
  1. drop table if exists tb_testnum; 
  2.  
  3. create table tb_testnum 
  4.     boxnumber  varchar(30)  not null, 
  5.     usertype   int          not null                                                                                   
  6. ); 
  7. create unique index idx1_tb_testnum on tb_testnum(boxnumber); 

其中,usertype字段的值必須要大于1。

對(duì)存儲(chǔ)過程進(jìn)行測試大致遵循以下步驟:

***步,按照存儲(chǔ)過程的輸入和輸出參數(shù)設(shè)置正確的調(diào)用樣式。

第二步,根據(jù)調(diào)用時(shí)的輸入?yún)?shù)值來向相關(guān)的表中插入測試數(shù)據(jù)。

第三步,執(zhí)行***步中的存儲(chǔ)過程調(diào)用語句,查看執(zhí)行結(jié)果是否正確,并根據(jù)該結(jié)果來修改存儲(chǔ)過程。

下面具體進(jìn)行說明。

***步

就本存儲(chǔ)過程pr_dealtestnum而言,根據(jù)程序邏輯,我們可設(shè)置如下調(diào)用語句:

 
 
  1. call pr_dealtestnum('2344273520',@1,@2);select @1,@2; 
  2. call pr_dealtestnum('2344273521',@1,@2);select @1,@2; 
  3. call pr_dealtestnum('2344273522',@1,@2);select @1,@2; 
  4. call pr_dealtestnum('2344273523',@1,@2);select @1,@2; 
  5. call pr_dealtestnum('2344273524',@1,@2);select @1,@2; 
  6. call pr_dealtestnum('2344273525',@1,@2);select @1,@2; 
  7. call pr_dealtestnum('2344273526',@1,@2);select @1,@2; 
  8. call pr_dealtestnum('2344273527',@1,@2);select @1,@2; 
  9. call pr_dealtestnum('2344273528',@1,@2);select @1,@2; 
  10. call pr_dealtestnum('2344273529',@1,@2);select @1,@2; 
  11. call pr_dealtestnum('2344273530',@1,@2);select @1,@2; 
  12. call pr_dealtestnum('2344273531',@1,@2);select @1,@2; 
  13. call pr_dealtestnum('2344273532',@1,@2);select @1,@2; 
  14. call pr_dealtestnum('2344273533',@1,@2);select @1,@2; 
  15. call pr_dealtestnum('2344273534',@1,@2);select @1,@2; 
  16. call pr_dealtestnum('15696192523',@1,@2);select @1,@2; 

大家還可以設(shè)置更多的調(diào)用語句,其目的是為了對(duì)存儲(chǔ)過程進(jìn)行更加充分的測試。

第二步

根據(jù)***步設(shè)置的調(diào)用語句,兼顧程序邏輯,我們可執(zhí)行如下語句向表tb_testnum中插入數(shù)據(jù):

 
 
  1. call pr_dealtestnum('2344273520',@1,@2);select @1,@2; 
  2. call pr_dealtestnum('2344273521',@1,@2);select @1,@2; 
  3. call pr_dealtestnum('2344273522',@1,@2);select @1,@2; 
  4. call pr_dealtestnum('2344273523',@1,@2);select @1,@2; 
  5. call pr_dealtestnum('2344273524',@1,@2);select @1,@2; 
  6. call pr_dealtestnum('2344273525',@1,@2);select @1,@2; 
  7. call pr_dealtestnum('2344273526',@1,@2);select @1,@2; 
  8. call pr_dealtestnum('2344273527',@1,@2);select @1,@2; 
  9. call pr_dealtestnum('2344273528',@1,@2);select @1,@2; 
  10. call pr_dealtestnum('2344273529',@1,@2);select @1,@2; 
  11. call pr_dealtestnum('2344273530',@1,@2);select @1,@2; 
  12. call pr_dealtestnum('2344273531',@1,@2);select @1,@2; 
  13. call pr_dealtestnum('2344273532',@1,@2);select @1,@2; 
  14. call pr_dealtestnum('2344273533',@1,@2);select @1,@2; 
  15. call pr_dealtestnum('2344273534',@1,@2);select @1,@2; 
  16. call pr_dealtestnum('15696192523',@1,@2);select @1,@2; 

第三步

在向表tb_testnum中插入數(shù)據(jù)之后,我們開始逐條執(zhí)行***步中的存儲(chǔ)過程調(diào)用語句,以驗(yàn)證存儲(chǔ)過程代碼邏輯的正確性。

首先執(zhí)行“call pr_dealtestnum(‘2344273520’,@1,@2);select @1,@2;”,結(jié)果如下:

 
 
  1. mysql> call pr_dealtestnum('2344273520',@1,@2);select @1,@2; 
  2. Query OK, 1 row affected (0.00 sec) 
  3.  
  4. +------+------+ 
  5. | @1   | @2   | 
  6. +------+------+ 
  7. |    0 |    2 | 
  8. +------+------+ 
  9. 1 row in set (0.00 sec) 

我們來分析執(zhí)行結(jié)果是否是我們想要的。將入?yún)ⅰ?344273520”帶入存儲(chǔ)過程中,首先是“select count(*) into p_boxnumcount from tb_testnum where boxnumber=’2344273520’;”,此時(shí)“boxnumcount”變量的值為1(因?yàn)橹皥?zhí)行過語句“insert into tb_testnum(boxnumber,usertype) values(‘2344273520’,1);”);接著,程序進(jìn)入“if p_boxnumcount > 0 then”分支,執(zhí)行“select usertype into p_usertype from tb_testnum where boxnumber=’2344273520’;”語句,“p_usertype”變量的值為1;然后,執(zhí)行“set p_outusertype = (1+1)/10*10;”語句,即“p_outusertype”變量的值為“2/10*10”,進(jìn)一步計(jì)算為“0*10”,最終結(jié)果為0;***,執(zhí)行“set p_result = 0;”語句,“p_result”變量的值為0。因此,最終兩個(gè)輸出參數(shù)的值都應(yīng)該為0。

但是,實(shí)際的結(jié)果是,兩個(gè)輸出參數(shù)的值分別為0和2,是哪里出了問題呢?我們重點(diǎn)分析“(1+1)/10*10”的結(jié)果,將之在MySQL中單獨(dú)執(zhí)行,結(jié)果如下:

 
 
  1. mysql> select (1+1)/10*10; 
  2. +-------------+ 
  3. | (1+1)/10*10 | 
  4. +-------------+ 
  5. |      2.0000 | 
  6. +-------------+ 
  7. 1 row in set (0.00 sec) 
  8.  
  9. mysql> select (1+1)/10; 
  10. +----------+ 
  11. | (1+1)/10 | 
  12. +----------+ 
  13. |   0.2000 | 
  14. +----------+ 
  15. 1 row in set (0.00 sec) 

我們可以看到,“(1+1)/10”的結(jié)果并不是我們預(yù)想的0,而是0.2,看來,在MySQL中,兩個(gè)整數(shù)相除并不是只取結(jié)果的整數(shù)部分,而是取了小數(shù)點(diǎn)后面的若干位。

那么,如果我們只想要整數(shù)部分,應(yīng)該怎么辦呢?此時(shí),可以用floor()函數(shù),即“floor((1+1)/10)”就是取了結(jié)果的整數(shù)部分,如下所示:

 
 
  1. mysql> select floor((1+1)/10); 
  2. +-----------------+ 
  3. | floor((1+1)/10) | 
  4. +-----------------+ 
  5. |               0 | 
  6. +-----------------+ 
  7. 1 row in set (0.00 sec 

現(xiàn)在,我們據(jù)此修改存儲(chǔ)過程,修改之后如下所示:

 
 
  1. drop procedure if exists pr_dealtestnum; 
  2. delimiter // 
  3.  
  4. create procedure pr_dealtestnum 
  5.     in    p_boxnumber    varchar(30), 
  6.     out   p_result       int, 
  7.     out   p_outusertype  int 
  8. pr_dealtestnum_label:begin 
  9.     declare   p_boxnumcount    int; 
  10.     declare   p_usertype       int; 
  11.  
  12.     set p_boxnumcount = 0; 
  13.     set p_usertype    = 0; 
  14.     set p_outusertype = 0; 
  15.  
  16.     select count(*) into p_boxnumcount from tb_testnum where boxnumber=p_boxnumber; 
  17.     if p_boxnumcount > 0 then 
  18.     begin 
  19.         select usertype into p_usertype from tb_testnum where boxnumber=p_boxnumber; 
  20.  
  21.         set p_outusertype =  floor((p_usertype+1)/10)*10; 
  22.  
  23.         set p_result = 0; 
  24.     end; 
  25.     else 
  26.     begin 
  27.         set p_result = 1; 
  28.     end; 
  29.     end if; 
  30.  
  31.     leave pr_dealtestnum_label; 
  32. end; 
  33. // 
  34. delimiter ; 
  35. select 'create procedure pr_dealtestnum ok'; 

再次執(zhí)行“call pr_dealtestnum(‘2344273520’,@1,@2);select @1,@2;”,結(jié)果如下:

 
 
  1. mysql> call pr_dealtestnum('2344273520',@1,@2);select @1,@2; 
  2. Query OK, 1 row affected (0.00 sec) 
  3.  
  4. +------+------+ 
  5. | @1   | @2   | 
  6. +------+------+ 
  7. |    0 |    0 | 
  8. +------+------+ 
  9. 1 row in set (0.00 sec) 

此時(shí)的結(jié)果就是我們想要的。

我們可以繼續(xù)執(zhí)行在***步中設(shè)置的其它存儲(chǔ)過程調(diào)用語句,結(jié)果如下:

 
 
  1. mysql> call pr_dealtestnum('2344273521',@1,@2);select @1,@2; 
  2. Query OK, 1 row affected (0.00 sec) 
  3.  
  4. +------+------+ 
  5. | @1   | @2   | 
  6. +------+------+ 
  7. |    0 |    0 | 
  8. +------+------+ 
  9. 1 row in set (0.00 sec) 
  10.  
  11. mysql> call pr_dealtestnum('2344273522',@1,@2);select @1,@2; 
  12. Query OK, 1 row affected (0.00 sec) 
  13.  
  14. +------+------+ 
  15. | @1   | @2   | 
  16. +------+------+ 
  17. |    0 |    0 | 
  18. +------+------+ 
  19. 1 row in set (0.00 sec) 
  20.  
  21. mysql> call pr_dealtestnum('2344273523',@1,@2);select @1,@2; 
  22. Query OK, 1 row affected (0.00 sec) 
  23.  
  24. +------+------+ 
  25. | @1   | @2   | 
  26. +------+------+ 
  27. |    0 |    0 | 
  28. +------+------+ 
  29. 1 row in set (0.00 sec) 
  30.  
  31. mysql> call pr_dealtestnum('2344273524',@1,@2);select @1,@2; 
  32. Query OK, 1 row affected (0.00 sec) 
  33.  
  34. +------+------+ 
  35. | @1   | @2   | 
  36. +------+------+ 
  37. |    0 |    0 | 
  38. +------+------+ 
  39. 1 row in set (0.00 sec) 
  40.  
  41. mysql> call pr_dealtestnum('2344273525',@1,@2);select @1,@2; 
  42. Query OK, 1 row affected (0.00 sec) 
  43.  
  44. +------+------+ 
  45. | @1   | @2   | 
  46. +------+------+ 
  47. |    0 |    0 | 
  48. +------+------+ 
  49. 1 row in set (0.00 sec) 
  50.  
  51. mysql> call pr_dealtestnum('2344273526',@1,@2);select @1,@2; 
  52. Query OK, 1 row affected (0.00 sec) 
  53.  
  54. +------+------+ 
  55. | @1   | @2   | 
  56. +------+------+ 
  57. |    0 |   10 | 
  58. +------+------+ 
  59. 1 row in set (0.00 sec) 
  60.  
  61. mysql> call pr_dealtestnum('2344273527',@1,@2);select @1,@2; 
  62. Query OK, 1 row affected (0.00 sec) 
  63.  
  64. +------+------+ 
  65. | @1   | @2   | 
  66. +------+------+ 
  67. |    0 |   10 | 
  68. +------+------+ 
  69. 1 row in set (0.00 sec) 
  70.  
  71. mysql> call pr_dealtestnum('2344273528',@1,@2);select @1,@2; 
  72. Query OK, 1 row affected (0.00 sec) 
  73.  
  74. +------+------+ 
  75. | @1   | @2   | 
  76. +------+------+ 
  77. |    0 |   10 | 
  78. +------+------+ 
  79. 1 row in set (0.00 sec) 
  80.  
  81. mysql> call pr_dealtestnum('2344273529',@1,@2);select @1,@2; 
  82. Query OK, 1 row affected (0.00 sec) 
  83.  
  84. +------+------+ 
  85. | @1   | @2   | 
  86. +------+------+ 
  87. |    0 |   10 | 
  88. +------+------+ 
  89. 1 row in set (0.00 sec) 
  90.  
  91. mysql> call pr_dealtestnum('2344273530',@1,@2);select @1,@2; 
  92. Query OK, 1 row affected (0.00 sec) 
  93.  
  94. +------+------+ 
  95. | @1   | @2   | 
  96. +------+------+ 
  97. |    0 |   10 | 
  98. +------+------+ 
  99. 1 row in set (0.00 sec) 
  100.  
  101. mysql> call pr_dealtestnum('2344273531',@1,@2);select @1,@2; 
  102. Query OK, 1 row affected (0.00 sec) 
  103.  
  104. +------+------+ 
  105. | @1   | @2   | 
  106. +------+------+ 
  107. |    0 |   10 | 
  108. +------+------+ 
  109. 1 row in set (0.00 sec) 
  110.  
  111. mysql> call pr_dealtestnum('2344273532',@1,@2);select @1,@2; 
  112. Query OK, 1 row affected (0.00 sec) 
  113.  
  114. +------+------+ 
  115. | @1   | @2   | 
  116. +------+------+ 
  117. |    0 |   20 | 
  118. +------+------+ 
  119. 1 row in set (0.00 sec) 
  120.  
  121. mysql> call pr_dealtestnum('2344273533',@1,@2);select @1,@2; 
  122. Query OK, 1 row affected (0.00 sec) 
  123.  
  124. +------+------+ 
  125. | @1   | @2   | 
  126. +------+------+ 
  127. |    0 |   50 | 
  128. +------+------+ 
  129. 1 row in set (0.00 sec) 
  130.  
  131. mysql> call pr_dealtestnum('2344273534',@1,@2);select @1,@2; 
  132. Query OK, 1 row affected (0.01 sec) 
  133.  
  134. +------+------+ 
  135. | @1   | @2   | 
  136. +------+------+ 
  137. |    0 |   80 | 
  138. +------+------+ 
  139. 1 row in set (0.00 sec) 
  140. mysql> call pr_dealtestnum('15696192523',@1,@2);select @1,@2; 
  141. Query OK, 1 row affected (0.01 sec) 
  142.  
  143. +------+------+ 
  144. | @1   | @2   | 
  145. +------+------+ 
  146. |    1 |    0 | 
  147. +------+------+ 
  148. 1 row in set (0.00 sec) 

可以看到,修改之后的存儲(chǔ)過程的執(zhí)行結(jié)果就是正確的了。***一條調(diào)用語句“call pr_dealtestnum(‘15696192523’,@1,@2);select @1,@2;”中,因?yàn)檩斎雲(yún)?shù)中的“15696192523”對(duì)應(yīng)的數(shù)據(jù)在tb_testnum表中不存在,因此程序進(jìn)入了“else”分支,“p_result”變量的值就為1,而“p_outusertype”變量的值為0。

總結(jié)

存儲(chǔ)過程的測試方法和用其它編程語言編寫的程序的測試方法是一樣的,都需要我們在充分理解程序邏輯的基礎(chǔ)上構(gòu)造完整的、多樣化的測試用例,并在測試的過程中根據(jù)測試的結(jié)果來修改程序,以達(dá)到我們預(yù)期的結(jié)果,并最終滿足用戶的需求。

需要強(qiáng)調(diào)的是,在軟件開發(fā)過程中,我們測試代碼的時(shí)間,很可能會(huì)多余我們編寫代碼的時(shí)間,大家一定要耐著性子忍受測試代碼過程中的“孤獨(dú)感”。

【本文是專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號(hào):周氏邏輯(logiczhou)】


文章題目:存儲(chǔ)過程測試流程--以MySQL為例
轉(zhuǎn)載來于:http://www.dlmjj.cn/article/cohicgo.html