成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

存儲過程測試流程--以MySQL為例

開發 開發工具
存儲過程的測試方法和用其它編程語言編寫的程序的測試方法是一樣的,都需要我們在充分理解程序邏輯的基礎上構造完整的、多樣化的測試用例,并在測試的過程中根據測試的結果來修改程序,以達到我們預期的結果,并最終滿足用戶的需求。

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

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

  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'

在存儲過程中使用到的表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。

對存儲過程進行測試大致遵循以下步驟:

***步,按照存儲過程的輸入和輸出參數設置正確的調用樣式。

第二步,根據調用時的輸入參數值來向相關的表中插入測試數據。

第三步,執行***步中的存儲過程調用語句,查看執行結果是否正確,并根據該結果來修改存儲過程。

下面具體進行說明。

***步

就本存儲過程pr_dealtestnum而言,根據程序邏輯,我們可設置如下調用語句:

  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中插入數據:

  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中插入數據之后,我們開始逐條執行***步中的存儲過程調用語句,以驗證存儲過程代碼邏輯的正確性。

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

  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) 

我們來分析執行結果是否是我們想要的。將入參“2344273520”帶入存儲過程中,首先是“select count(*) into p_boxnumcount from tb_testnum where boxnumber=’2344273520’;”,此時“boxnumcount”變量的值為1(因為之前執行過語句“insert into tb_testnum(boxnumber,usertype) values(‘2344273520’,1);”);接著,程序進入“if p_boxnumcount > 0 then”分支,執行“select usertype into p_usertype from tb_testnum where boxnumber=’2344273520’;”語句,“p_usertype”變量的值為1;然后,執行“set p_outusertype = (1+1)/10*10;”語句,即“p_outusertype”變量的值為“2/10*10”,進一步計算為“0*10”,最終結果為0;***,執行“set p_result = 0;”語句,“p_result”變量的值為0。因此,最終兩個輸出參數的值都應該為0。

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

  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”的結果并不是我們預想的0,而是0.2,看來,在MySQL中,兩個整數相除并不是只取結果的整數部分,而是取了小數點后面的若干位。

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

  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 

現在,我們據此修改存儲過程,修改之后如下所示:

  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'

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

  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) 

此時的結果就是我們想要的。

我們可以繼續執行在***步中設置的其它存儲過程調用語句,結果如下:

  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) 

可以看到,修改之后的存儲過程的執行結果就是正確的了。***一條調用語句“call pr_dealtestnum(‘15696192523’,@1,@2);select @1,@2;”中,因為輸入參數中的“15696192523”對應的數據在tb_testnum表中不存在,因此程序進入了“else”分支,“p_result”變量的值就為1,而“p_outusertype”變量的值為0。

總結

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

需要強調的是,在軟件開發過程中,我們測試代碼的時間,很可能會多余我們編寫代碼的時間,大家一定要耐著性子忍受測試代碼過程中的“孤獨感”。

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

責任編輯:武曉燕 來源: csdn博客
相關推薦

2022-02-14 14:28:57

驅動開發鴻蒙系統

2011-08-04 09:57:03

dbmonsterMySQL

2021-08-02 09:50:47

Vetur源碼SMART

2022-02-16 15:55:21

驅動調用操作系統鴻蒙

2010-05-26 14:55:43

MySQL存儲過程

2022-02-17 19:59:10

LED燈開發鴻蒙

2018-01-25 08:29:28

Kafka源碼存儲

2021-05-31 08:00:00

消息隊列架構Rabbit MQ

2018-08-22 16:40:51

前端JavascriptVue

2020-11-26 10:33:44

MySQL存儲函數

2021-10-15 06:43:11

數據庫存儲過程

2010-06-04 14:18:10

MySQL 分頁存儲過

2011-07-08 09:55:02

數據中心防震

2009-05-05 14:22:44

摩卡mochaIT運維管理

2022-01-10 12:23:00

TypeScript ESLint前端

2009-03-02 16:57:34

LinuxUbuntu配置完全方案

2021-01-14 09:00:00

開發FedoraUbuntu

2021-04-16 08:20:00

Flink CEP直播監控

2025-05-13 08:09:56

2010-10-09 17:08:15

MySQL存儲過程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩高清一区二区 | 欧洲尺码日本国产精品 | 亚洲九九 | 日日骚视频 | 日本一区二区高清视频 | 亚洲高清在线 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 欧美一二三区 | 亚洲精品欧美一区二区三区 | 亚洲精品亚洲人成人网 | av中文字幕在线 | 国产小视频在线观看 | 亚洲一区二区免费 | 亚洲成av片人久久久 | 午夜欧美日韩 | 极品国产视频 | 国产精品视频播放 | 日韩在线免费视频 | 日韩精品 电影一区 亚洲 | 国产www成人 | 中文字幕第一页在线 | 久久久精品一区 | 久久综合久色欧美综合狠狠 | 亚洲国产精品99久久久久久久久 | 久久亚洲一区 | 黄色网址大全在线观看 | 久久精品中文字幕 | 亚洲91精品| 欧美激情欧美激情在线五月 | 99视频在线免费观看 | www四虎com| 国产一区二区三区免费观看在线 | 成年女人免费v片 | 国产精品久久久久一区二区三区 | 国产高清精品在线 | 91.com视频 | 欧美精产国品一二三区 | 天天久久 | 日韩精品久久一区二区三区 | 国产成人精品久久二区二区91 | 成人国产精品色哟哟 |