Visual Studio 2010 Ultimate Web Performance Test и нагрузочный тест Виртуальные учетные записи пользователей

Мне нужно выполнить нагрузочное тестирование веб-сайта. Он использует Crowd Authentication для аутентификации пользователей.

Я создал тестовый проект Visual Studio 2010 и создал веб-тест производительности, который входит в систему, используя имя пользователя и пароль, которые я использовал при записи теста. Я прикрепил базу данных доступа с таблицей под названием «Пользователи», которую я привязал к форме входа, и набор тестов запускает тест для каждой строки данных в таблице пользователей.

Это все работает, как я и ожидал.

Теперь я хочу запустить нагрузочный тест с максимальным количеством одновременных пользователей 250. Как указать Visual Studio использовать другое имя пользователя и пароль для каждого из виртуальных пользователей в нагрузочном тесте.

Короче говоря, я хочу настроить профиль для каждого виртуального пользователя в нагрузочном тесте.


person Peter    schedule 27.07.2010    source источник


Ответы (1)


Я бы создал веб-тест, который использует только один логин за раз для входа в систему. Затем вы можете либо создать небольшой фрагмент кода в веб-тесте, чтобы получить «случайный» логин из базы данных, либо список в коде для выбора логина.

Если вам требуется уникальный логин для каждого теста, вам придется оценить, сколько логинов требуется, и предварительно заполнить это количество.

Проблема с выбором из базы данных заключается в том, что виртуальные пользователи совместно используют потоки, и любой блокирующий код в тесте заблокирует более одного виртуального пользователя. Можно создать в памяти список, содержащий все данные для входа в систему, но управление общим объектом в многопоточной среде требует осторожности.

Для нас мы создали хранимую процедуру, которая будет получать следующий пароль для входа и имя пользователя, а затем вызывать следующий метод для получения следующего входа.

   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;
    }

Это сработало для нас без проблем, и возвращаемые значения можно было добавить к правильному параметру сообщения формы. Если вы используете обычную аутентификацию, тот же код можно использовать в конструкторе нагрузочного теста для изменения свойств WebTest.UserName и WebTest.Password.

Наша хранимая процедура работала со списком доступных логинов и таблицей с одним целочисленным полем под названием CurrentLoginID.

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
person Nat    schedule 29.07.2010
comment
Нэт, похоже, это разумный подход к решению проблемы. Я надеялся, что есть какая-то волшебная недокументированная конфигурация, которая сделает то, что я хочу. Я думаю, что буду беспокоиться о входах в систему, написав больше веб-тестов для конкретных учетных записей и просто загрузив их. - person Peter; 29.07.2010