一、數據庫並發測試的必要性
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,博為峰