我将创建一个网络测试,一次只使用一个登录名来登录。然后,您可以在 webtest 中创建一小段代码,以从数据库中获取“随机”登录,并在代码列表中选择登录。
如果您需要为每个测试使用唯一的登录名,则必须估计需要多少次登录名并预先填充该数量。
从数据库中选择的问题是虚拟用户共享线程并且测试中的任何阻塞代码都会阻塞多个虚拟用户。
可以在内存中创建一个包含所有登录详细信息的列表,但在高度多线程的环境中管理共享对象需要小心。
对于我们来说,我们创建了一个存储过程,它将获取下一次登录密码和用户名,然后调用以下方法来获取下一次登录。
public static bool GetNextLogin(out string userName, out string password)
{
bool result = false;
using (SqlConnection connection = new SqlConnection(loadTestLoginsConnection))
{
using (SqlCommand command = new SqlCommand("GetNextID", connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
userName = reader["UserName"].ToString().Trim();
password = reader["Password"].ToString().Trim();
result = true;
}
}
}
}
return result;
}
这对我们来说没有问题,并且可以将返回的值添加到正确的表单 post 参数中。如果您使用的是普通身份验证,则可以在负载测试构造函数中使用相同的代码来更改 WebTest.UserName 和 WebTest.Password 属性。
我们的存储过程处理一个可用登录列表和一个表,其中包含一个名为 CurrentLoginID 的 int 字段
BEGIN TRANSACTION
BEGIN TRY
DECLARE @CurrentID AS INT
UPDATE CurrentLoginID SET Number = Number+1
SELECT @CurrentID = Number FROM CurrentLoginID
SELECT [Password], UserName FROM AvailableLogins WHERE AvailableLogins.ID = @CurrentID
COMMIT
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
ROLLBACK TRAN
END CATCH