一、数据库并发测试的必要性
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
{
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,博为峰