Я бы создал веб-тест, который использует только один логин за раз для входа в систему. Затем вы можете либо создать небольшой фрагмент кода в веб-тесте, чтобы получить «случайный» логин из базы данных, либо список в коде для выбора логина.
Если вам требуется уникальный логин для каждого теста, вам придется оценить, сколько логинов требуется, и предварительно заполнить это количество.
Проблема с выбором из базы данных заключается в том, что виртуальные пользователи совместно используют потоки, и любой блокирующий код в тесте заблокирует более одного виртуального пользователя. Можно создать в памяти список, содержащий все данные для входа в систему, но управление общим объектом в многопоточной среде требует осторожности.
Для нас мы создали хранимую процедуру, которая будет получать следующий пароль для входа и имя пользователя, а затем вызывать следующий метод для получения следующего входа.
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