【问题标题】:Visual Studio 2010 Ultimate Web Performance Test and Load Test Virtual User AccountsVisual Studio 2010 Ultimate Web 性能测试和负载测试虚拟用户帐户
【发布时间】:2010-07-27 04:07:03
【问题描述】:

我需要对网站进行负载测试。它使用人群身份验证对用户进行身份验证。

我创建了一个 Visual Studio 2010 测试项目并创建了一个 Web 性能测试,该测试使用我在记录测试时使用的用户名和密码登录。我附加了一个 access 数据库,其中包含一个名为 Users 的表,我已将其绑定到登录表单,并且测试套件对 users 表中的每一行数据运行测试。

这一切都如我所料。

现在我想对最多 250 个并发用户运行负载测试。如何告诉 Visual Studio 为负载测试中的每个虚拟用户使用不同的用户名和密码。

简而言之,我想为负载测试中的每个虚拟用户设置一个配置文件。

【问题讨论】:

    标签: visual-studio load-testing


    【解决方案1】:

    我将创建一个网络测试,一次只使用一个登录名来登录。然后,您可以在 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
    

    【讨论】:

    • Nat,这看起来是解决问题的合理方法。我希望有一些神奇的“无证”配置可以做我想要的。我想我会通过编写更多特定于帐户的 Web 测试并对其进行负载测试来担心登录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多