WebTest com session-ID em URL
Pergunta
Temos um site ASP.NET que o redireciona para um URL que mostra um ID da sessão. assim:
http: // localhost/(s (f3rjcw45q4cqarboeme53lbx)) /Main.aspx
Este ID é único a cada solicitação.
É possível testar este site usando um teste web padrão do Visual Studio 2008/2010? Como posso fornecer o teste esses dados?
Eu tenho que ligar para algumas páginas diferentes usando o mesmo ID.
Solução
Sim, é relativamente fácil fazer isso. Você precisará criar um teste da web codificado, no entanto.
No meu exemplo, temos uma postagem de login que retornará o URL, incluindo a sessão da sessão. Logo após o rendimento da solicitação de postagem de login (solicitação3) ao enumerador, chamo o seguinte.
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;
Onde geturlcookie é algo assim:
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;
}
Depois de ter a corda de cookie da sessão, você pode substituí -la muito fácil em qualquer URLS subsequente por solicitação/post, por exemplo
WebTestRequest request4 = new WebTestRequest((this.Context["WebServer1"].ToString() + cookieUrl + "/mySecureForm.aspx"));
Peço desculpas por meu código ser tão difícil, mas foi preso no meu projeto e é retirado da primeira versão da base de código - e por dizer que foi fácil :)
Para qualquer teste de carga, dependendo do seu aplicativo, talvez seja necessário criar um procedimento armazenado para ligar para fornecer informações de login distintas sempre que o teste for executado.
Observe que, como o URL da resposta não pode ser determinado com antecedência, para a postagem de login, você precisará desligar temporariamente o UrlValidationEventHandler. Para fazer isso, guardo o ValidationRuleeventHandler em uma variável local:
ValidateResponseUrl validationRule1 = new ValidateResponseUrl();
urlValidationRuleEventHandler = new EventHandler<ValidationEventArgs>(validationRule1.Validate);
Então, pode ativá -lo e desligar o que eu exigir:
this.ValidateResponse -= urlValidationRuleEventHandler ;
this.ValidateResponse += urlValidationRuleEventHandler ;
A alternativa é codificar o seu, como esse (refletido no código do Visual Studio e alterado para ser insensível ao caso.
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;
}
}
}
}
}