2009-11-26 4 views

Répondre

4

Oui, c'est relativement facile à faire. Vous devrez cependant créer un test Web codé.

Dans mon exemple, nous avons un post de connexion qui renverra l'URL, y compris la chaîne de session. Juste après le nous donnons la demande de poste de connexion (request3) à l'énumérateur que j'appelle ce qui suit.

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 est quelque chose comme 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 remplacer vraiment facile dans toutes les urls suivantes de la demande/post par exemple

WebTestRequest request4 = new WebTestRequest((this.Context["WebServer1"].ToString() + cookieUrl + "/mySecureForm.aspx")); 

Je présente mes excuses pour mon code étant si rude, mais il a été dépréciés dans mon projet et est tiré de la première version du code de base - et pour dire qu'il é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 fois que le test est exécuté.

Notez que, parce que l'url de réponse ne peut pas être déterminée à l'avance, pour le poste de connexion, vous devrez temporairement désactiver urlValidationEventHandler. Pour ce faire, je stocke l'validationruleeventhandler dans une variable locale:

 ValidateResponseUrl validationRule1 = new ValidateResponseUrl(); 
     urlValidationRuleEventHandler = new EventHandler<ValidationEventArgs>(validationRule1.Validate); 

Alors peut alors allumer et éteindre comme je requiers:

this.ValidateResponse -= urlValidationRuleEventHandler ; 
this.ValidateResponse += urlValidationRuleEventHandler ; 

L'alternative consiste à coder votre propre comme celui-ci (reflectored à partir du code Visual Studio et modifié pour être insensible à 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; 
       } 
      } 
     } 
    } 
} 
Questions connexes