Webtest avec identifiant de session dans l'URL
Question
Nous avons un site ASP.Net qui vous redirige vers une URL qui affiche un identifiant de session. comme ceci:
http: // localhost / (S (f3rjcw45q4cqarboemelbx) /main.aspx / a>
Cet identifiant est unique pour chaque requête.
Est-il possible de tester ce site à l'aide d'un test Web standard de Visual Studio 2008/2010? Comment puis-je fournir au test ces données?
Je dois appeler deux pages différentes en utilisant le même identifiant.
La solution
Oui, c'est relativement facile à faire. Vous devrez cependant créer un test Web codé.
Dans mon exemple, nous avons un message de connexion qui renverra l'URL, y compris la chaîne de session. Juste après, nous cédons la demande de connexion (request3) à l’énumérateur que j’appelle:
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;
Où GetUrlCookie ressemble à ceci:
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;
}
Une fois que vous avez la chaîne de cookie de session, vous pouvez la remplacer très facilement dans les URL suivantes pour request / post par exemple
WebTestRequest request4 = new WebTestRequest((this.Context["WebServer1"].ToString() + cookieUrl + "/mySecureForm.aspx"));
Je m'excuse pour mon code si dur, mais il était obsolète dans mon projet et extrait de la première version de la base de code - et pour avoir dit que c'était facile:)
Pour tout test de charge, en fonction de votre application, vous devrez peut-être créer une procédure stockée à appeler pour fournir des informations de connexion distinctes à chaque exécution du test.
Veuillez noter que l’URL de la réponse ne pouvant pas être déterminé à l’avance, vous devrez désactiver temporairement le lien urlValidationEventHandler. Pour ce faire, je stocke le validationruleeventhandler dans une variable locale:
ValidateResponseUrl validationRule1 = new ValidateResponseUrl();
urlValidationRuleEventHandler = new EventHandler<ValidationEventArgs>(validationRule1.Validate);
Vous pouvez ensuite l'activer et le désactiver selon vos besoins:
this.ValidateResponse -= urlValidationRuleEventHandler ;
this.ValidateResponse += urlValidationRuleEventHandler ;
L’alternative consiste à coder le vôtre tel que celui-ci (reflété à partir du code de Visual Studio et modifié pour ne pas être sensible à la casse.
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;
}
}
}
}
}