Веб-тест с идентификатором сессии в URL
Вопрос
У нас есть сайт ASP.Net, который перенаправляет вас на URL с идентификатором сеанса. как это:
http: // localhost / (S (f3rjcw45q4cqarboeme53lbx)) /main.asp а> р>
Этот идентификатор уникален для каждого запроса. Р>
Можно ли протестировать этот сайт с помощью стандартного веб-теста visual studio 2008/2010? Как я могу предоставить тесту эти данные? Р>
Мне нужно вызвать несколько разных страниц, используя один и тот же идентификатор.
Решение
Да, это относительно легко сделать. Однако вам нужно будет создать закодированный веб-тест.
В моем примере у нас есть сообщение для входа, которое будет возвращать URL, включая строку сеанса. Сразу после того, как мы передаем запрос на вход в систему (request3) перечислителю, я вызываю следующее.
WebTestRequest request3 = new WebTestRequest((this.Context["WebServer1"].ToString() + "/ICS/Login/English/Login.aspx"));
//more request setup code removed for clarity
yield return request3;
string responseUrl = Context.LastResponse.ResponseUri.AbsoluteUri;
string cookieUrl = GetUrlCookie(responseUrl, this.Context["WebServer1"].ToString(),"/main.aspx");
request3 = null;
Где GetUrlCookie выглядит примерно так:
public static string GetUrlCookie(string fullUrl, string webServerUrl, string afterUrlPArt)
{
string result = fullUrl.Substring(webServerUrl.Length);
result = result.Substring(0, result.Length - afterUrlPArt.Length);
return result;
}
Получив строку cookie сеанса, вы можете легко заменить ее в любых последующих URL-адресах для запроса / публикации. например.
WebTestRequest request4 = new WebTestRequest((this.Context["WebServer1"].ToString() + cookieUrl + "/mySecureForm.aspx"));
Я прошу прощения за мой грубый код, но он устарел в моем проекте и взят из первой версии кодовой базы - и за то, что это было легко:)
При любом нагрузочном тестировании, в зависимости от вашего приложения, вам может потребоваться создать хранимую процедуру для вызова, чтобы при каждом тестировании предоставлять различную информацию для входа.
Обратите внимание: поскольку URL-адрес ответа не может быть определен заранее, для сообщения входа в систему вам придется временно отключить urlValidationEventHandler. Для этого я сохраняю validationruleeventhandler в локальной переменной:
ValidateResponseUrl validationRule1 = new ValidateResponseUrl();
urlValidationRuleEventHandler = new EventHandler<ValidationEventArgs>(validationRule1.Validate);
Так что можете включать и выключать его по мере необходимости:
this.ValidateResponse -= urlValidationRuleEventHandler ;
this.ValidateResponse += urlValidationRuleEventHandler ;
Альтернативой является кодирование вашего собственного кода, такого как этот (отражено в коде Visual Studio и изменено с учетом регистра.
class QueryLessCaseInsensitiveValidateResponseUrl : ValidateResponseUrl
{
public override void Validate(object sender, ValidationEventArgs e)
{
Uri uri;
string uriString = string.IsNullOrEmpty(e.Request.ExpectedResponseUrl) ? e.Request.Url : e.Request.ExpectedResponseUrl;
if (!Uri.TryCreate(e.Request.Url, UriKind.Absolute, out uri))
{
e.Message = "The request URL could not be parsed";
e.IsValid = false;
}
else
{
Uri uri2;
string leftPart = uri.GetLeftPart(UriPartial.Path);
if (!Uri.TryCreate(uriString, UriKind.Absolute, out uri2))
{
e.Message = "The request URL could not be parsed";
e.IsValid = false;
}
else
{
uriString = uri2.GetLeftPart(UriPartial.Path);
////this removes the query string
//uriString.Substring(0, uriString.Length - uri2.Query.Length);
Uri uritemp = new Uri(uriString);
if (uritemp.Query.Length > 0)
{
string fred = "There is a problem";
}
//changed to ignore case
if (string.Equals(leftPart, uriString, StringComparison.OrdinalIgnoreCase))
{
e.IsValid = true;
}
else
{
e.Message = string.Format("The value of the ExpectedResponseUrl property '{0}' does not equal the actual response URL '{1}'. QueryString parameters were ignored.", new object[] { uriString, leftPart });
e.IsValid = false;
}
}
}
}
}