數據庫並發測試


一、數據庫並發測試的必要性

1、與數據庫連接的服務程序采用多線程同時開啟多個數據庫連接;

2、與數據庫連接的服務程序單線程,但是同時開啟多套服務程序;

以上兩種情況均會產生對數據庫的並發訪問操作,數據庫並發訪問會導致數據庫數據錯誤,數據庫死鎖等故障,需要在測試階段進行充分測試。

二、數據庫並發測試方法

1、利用測試工具模擬多個最終用戶進行並發測試;

  這種測試方法的缺點:最終用戶往往不是直接連接在數據庫上,而是經過一個或多個中間服務程序,所以並不能保證訪問數據庫時是否並發;其次,這種測試方法需要等到客戶端程序、服務端程序全部完成才能進行。

2、利用測試工具寫腳本,直接連接數據庫進行並發測試;

  這種方法可以有效的保證並發操作,而且在數據庫訪問程序完成即可測試,可以大大縮短測試時間,而且測試效果更好。

三、案例演示

  下面通過一個演示程序,演示使用Robot使用第二種測試方法進行數據庫的並發測試:

  第一步:創建演示程序:打開SQL SERVER查詢分析器,在SQL SERVER測試數據庫中執行下列腳本(腳本執行操作:創建表testtable,並插入一條記錄;創建存儲過程test):

-------

    if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[testtable]') and OBJECTPROPERTY(id,N'IsUserTable') = 1)

    drop table [dbo.testtable]

    GO

    CREATE TABLE [dbo].[testtable](

      [testid] [int] NULL,

      [counts] [int] NULL

    ) ON [PRIMARY]

    GO

    insert into testtable(testid,counts) values(1,0)

    GO

-------

    if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[Test]') and OBJECTPROPERTY(id,N'IsProcedure') = 1)

    drop procedure [dbo.Test]

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    CREATE Procedure dbo.Test

    as

      declare @count int

      begin tran TEST

        select @count = counts from testtable where testid = 1

        update testtable set counts = @count +1

      if(@@error > 0) begin

        rollback tran TEST

      end else begin

        commit tran TEST

      end

      GO  

      SET QUOTED_IDETIFIER OFF

      GO

      SET ANSI_NULLS ON

      GO

  第二步:創建測試腳本:在Robot中新建VU腳本,輸入以下內容:

    #include<VU.h>

    {

      push Timeout_scale = 200; /*Set timeout to 200% of maximum response time*/

      push Think_def = "LR";

      Min_tmout = 120000; /*Set minimum Timeout_val to 2 minutes*/

      push Timeout_val = Min_tmout;

 

      ser = sqlconnect("server","sa","888","192.168.0.99","sqlserver");

      set Server_connect = ser;

      push Think_avg = 0;

      sync_point "logon";

      sqlexec["sql_1000"] "testdb..test";

      sqldisconnect(ser);

    }

    說明:

    ser = sqlconnect("server","sa","888","192.168.0.99","sqlserver")

    sa為數據庫用戶名,888為sa密碼,192.168.0.99數據庫IP地址

    以上三項按實際的測試數據庫設置更改,其他兩項不用修改

    sqlexec["sql_1000"] "testdb.test"

    testdb為新建存儲過程test所在的數據庫,按實際的數據庫修改

    第三步:執行測試:運行上一步創建的腳本(運行時自動創建Suite),在Run Suite窗口中的“Number of users”上輸入20,運行完腳本,打開數據庫查看counts的數值。把counts值改為零多次運行腳本,觀察每次運行后counts的結果。

 

    測試說明:

      (1)測試實例程序的目的是,存儲過程test每執行一次,表testtable中的counts字段增加1;

      (2)第三步的測試可以發現每次執行后counts結果並不相同,而且不等於20,這說明這個程序是在並發時是問題的。

      (3)將存儲過程中的select @count = counts from testtable where testid = 1 修改為 select @count = counts from testtable with (UPDLOCK) where testid = 1。再次進行並發測試,每次的結果應該都是20.

 

    以上演示程序,僅僅演示了測試的方法。在實際的數據庫並發測試中,首先要確定存在哪些並發情況、哪些數據庫收到並發影響,然后編寫腳本,設置suite進行並發測試。

 from:51testing,博為峰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM